1.全局变量可以在最后去定义并初始化,不一定非要在开头

2.此题有一种特殊情况需要考虑,比如字符串是“aa”,那输出应该是“aa”,而不是“aa,aa”,即相同的不输出。实现这个处理用了c++中的容器set,set不保存重复元素。在存储的时候,遇到相同的元素,set不会把相同的元素保存进set。clear是清空set中的元素。

3.迭代器的使用

class Solution {
public:
vector<string> Permutation(string str) {
if(str.size() == )
return ans;
length = str.size();
int begin = ;
Permutation(str,begin);
//res.clear();
set<string>::iterator it;
for (it = res.begin(); it != res.end(); ++it)
ans.push_back(*it);
return ans;
}
void Permutation(string str,int begin){
if(begin == length){
res.insert(str);//insert可以直接加str的!不是只有迭代器!
return;
}
for(int i = begin;i < length;i++){
swap(str[begin],str[i]);
Permutation(str,begin+);
swap(str[begin],str[i]);
}
}
set<string> res;
vector<string> ans;
int length = ;
};

一种典型错误:

class Solution {
public:
vector<string> Permutation(string str) {
if(str.size() == )
return ans;
int length = str.size();
int begin = ;
Permutation(str,begin);
//res.clear();
set<string>::iterator it;
        for (it = res.begin(); it != res.end(); ++it)
            ans.push_back(*it);
return ans;
}
void Permutation(string str,int begin){
if(begin == length){
res.insert(str);
return;
}
for(int i = begin;i < length;i++){
swap(str[begin],str[i]);
Permutation(str,begin+);
swap(str[begin],str[i]);
}
}
set<string> res;
vector<string> ans;
};

正确代码中的length是一个全局变量,这里在Permutation(string str,int begin)中没有定义length,如果想在Permutation(string str,int begin)中使用Permutation(string str)的length,就必须把参数传进函数

中,即Permutation(string str,int begin,int length)。

思路错误的一种方法:

class Solution {
public:
vector<string> Permutation(string str) {
vector<string> result;
set<string> ans;
set<string>::iterator it
int length = str.length();
if(length <= )
return result;
for(int i = ;i < length;i++){
for(int j = i;j < length;j++){
char tmp = str[j];
str[j] = str[i];
str[i] = tmp;
ans.insert(str);
char tmp1 = str[j];
str[j] = str[i];
str[i] = tmp1;
}
}
for(it = ans.begin();it != ans.end();it++){
result.push_back(*it);
}
return result;
}
};

这种思路的错误,以abc为例,只能得到abc、bac、cba、acb,但没有考虑到以b开头的bca和以c开头的cab

这个思路很好反应递归和普通一个循环的区别。

从思路的角度,把一个字符串分为前后两部分,比如a bcd,分别拿a与bcd去交换,然后固定第一个位置,再去找bcd的字符串排列。剑指offer上对整个思路讲解的很好,实现这个思路用递归来实现,而不是普通的循环。

剑指offer28 字符串的排列的更多相关文章

  1. leetcode46. Permutations 、47. Permutations II、 剑指offer字符串的排列

    字符串排列和PermutationsII差不多 Permutations第一种解法: 这种方法从0开始遍历,通过visited来存储是否被访问到,level代表每次已经存储了多少个数字 class S ...

  2. 剑指Offer——字符串的排列

    题目描述: 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入描述: ...

  3. 剑指offer--9.字符串的排列

    next_permutation(),还是那个feel ------------------------------------------------------------------------ ...

  4. 剑指Offer-27.字符串的排列(C++/Java)

    题目: 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入描述: 输入 ...

  5. 用js刷剑指offer(字符串的排列)

    题目描述 题目描述 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入 ...

  6. 【剑指offer28:字符串的排列】【java】

    题目:输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. import ja ...

  7. 剑指Offer——字符串的排序

    Question 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入描 ...

  8. 剑指Offer26 字符串的全排列

    /************************************************************************* > File Name: 26_String ...

  9. 剑指offer字符串列表

    字符串 面试题5:替换空格 面试题20:表示数值的字符串 面试题58:翻转字符串 面试题58(二):左旋转字符串

随机推荐

  1. vmware虚拟机提示:无法将Ethernet0连接到虚拟网络vmnet02018-03-07

    编辑——虚拟机网络编辑——还原虚拟机网络配置可以解决

  2. Smarty保留变量信息

    对php里边的超级全局数组变量信息的使用 例如:$_GET.$_POST.$_SESSION.$_COOKIE.$_REQUEST.$_SERVER.$_ENV.$GLOBALS.$_FILES.常量 ...

  3. 08-----pymysql模块使用

    pymysql的下载和使用 exctue() 之sql注入 增.删.改:conn.commit() 查:fetchone.fetchmany.fetchall   一.pytmysql的下载和使用  ...

  4. oracle数据库代码块

    --申明变量.游标 declare a ):'; --逻辑 begin INSERT into TEMP_DSF.TEST VALUES (a); end; tips:mysql不支持匿名块.仅在存储 ...

  5. android Binder机制(一)架构设计

    Binder 架构设计 Binder 被设计出来是解决 Android IPC(进程间通信) 问题的.Binder 将两个进程间交互的理解为 Client 向 Server 进行通信. 如下:bind ...

  6. spark RDD运算机制

  7. Searching the Web论文阅读

    Searching the Web   (Arvind Arasu etc.) 1. 概述 2000年,23%网页每天更新,.com域内网页40%每天更新.网页生存半衰期是10天.描述方法可用Pois ...

  8. [编程题] 小易喜欢的数列 dp

    https://www.nowcoder.com/question/next?pid=6291726&qid=112729&tid=12736753 [编程题] 小易喜欢的数列 时间限 ...

  9. jemeter+badboy录制脚本

    Jmeter 是一个非常流行的性能测试工具,虽然与LoadRunner相比有很多不足,比如:它结果分析能力没有LoadRunner详细:很它的优点也有很多: l       开源,他是一款开源的免费软 ...

  10. LeetCode 981.基于时间的键值存储(C++)

    创建一个基于时间的键值存储类 TimeMap,它支持下面两个操作: 1. set(string key, string value, int timestamp) 存储键 key.值 value,以及 ...