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. 在ubuntu中安装mysql及简单操作方式

    老规矩,ctrl+alt+t呼出终端, 输入 sudo apt-get update 更新源,否则在运行下面代码时会报出有几个包无法下载,你还是得回来执行这句代码, 输入 sudo apt-get i ...

  2. js中的内置对象

    在js里,一切皆为或者皆可以被用作对象.可通过new一个对象或者直接以字面量形式创建变量(如var i="aaa"),所有变量都有对象的性质.注意:通过字面量创建的对象在调用属性和 ...

  3. 使用eclipse IDE遇到的问题

    Problems opening an editor Reason project name does not exist 项目右键->configure->convert to mave ...

  4. MATLAB字符串处理

    字符串处理 MATLAB中字符串用单引号   如果字符串中存在单引号,要使用两个单引号. length()元素个数 (1)字符串的执行 格式:eval(s) s表示字符串 abs()和double() ...

  5. Hadoop2.X HA架构与部署

    HDFS-HA原理及配置 1.HDFS-HA架构原理介绍 hadoop2.x之后,Clouera提出了QJM/Qurom Journal Manager,这是一个基于Paxos算法实现的HDFS HA ...

  6. spring boot 配置redis

    先配置属性: # database name spring.redis.database=0 # server host spring.redis.host=127.0.0.1 # server pa ...

  7. Aspose.Words导出图片 表格 Interop.Word

    先定义一个WORD 模板, 然后替换文本.域 ,定位开始表格 文本和段落 // Specify font formatting Aspose.Words.Font font = builder.Fon ...

  8. C# DialogResult的用法

    在程序中,经常会弹出一个对话框来让用户填写一些信息,填写完成后,当用户点击“确定”按钮后,在主窗体中进行其他的处理.比如一个简单的例子,在主窗体中有一个菜单,是“增加用户”,当点击这个菜单之后,我们需 ...

  9. 利用自定义特性实现List的多属性排序

    知道linq有order by的功能,但是还是动手研究了一下,算是多实践实践反射.这篇算是笔记,直接上代码: using System; using System.Collections.Concur ...

  10. intellijidea课程 intellijidea神器使用技巧1-3 idea下载

    下载: 下载地址:https://www.jetbrains.com/idea/download/ download==>windows==>ultimate版本(付费版本免费试用30天) ...