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上对整个思路讲解的很好,实现这个思路用递归来实现,而不是普通的循环。

最新文章

  1. C#基础-FileStream实现多线程断点续传
  2. js判断手机 横屏模式
  3. Support Vector Machine (2) : Sequential Minimal Optimization
  4. Duilib技巧:背景图片平铺
  5. LeetCode:Remove Duplicates from Sorted List I II
  6. 如何使用java中的对象
  7. 黑马程序员——Foundation中的OC结构体
  8. boost.asio源码剖析(四) ---- asio中的泛型概念(concepts)
  9. 判断URL是否存在
  10. [topcoder]UnsealTheSafe
  11. 《Swift Programming Language 》——Swift中怎样使用继承(Inheritance)
  12. (5)java中的常用API,其实就是一些常见类的使用
  13. Python Web框架篇:Django文件上传
  14. 阿里注册中心nacos使用整合Dubbo-原创
  15. ss with kcptun
  16. 关于html5中的 网页图标问题
  17. eclipse中建geoserver源码
  18. 升级nodejs至最新
  19. 通过phantomjs 进行页面截图
  20. sysbench 0.5 基准测试

热门文章

  1. 关于处理百万级大批量数据的mysql运行几个重要点
  2. 性能测试工具LoadRunner31-LR之链接mysql
  3. 性能测试工具LoadRunner24-LR之Analysis 系统资源分析
  4. [转]关于Jquery的DataTables里TableTools的应用
  5. mysql 8 修改root 密码
  6. aspx页面导出为word
  7. React.js 小书 Lesson7 - 组件的 render 方法
  8. POJ 3177——Redundant Paths——————【加边形成边双连通图】
  9. CKEditor4.4.5 插入高度代码及上传图片
  10. css中的伪元素,我今天记住了!o~yeah