题目描述
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则按字典序打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
解题思路
由于刚开始看到这个题目,我完全没有思路,因此参考了网上的一些解法。
这个题目的解法可以分为三步:
1、将字符串分为首字符和后面的字符两部分;
2、将首字符依次和后面的字符交换;
3、将后面的字母也按照步骤1 2进行递归,直到交换为止。
一些小问题:
1、遇到重复的字符,可以略过,不需要进行交换。
2、看网上的资料时发现在进行交换后,递归返回后要把交换的元素复原到原位置,才不会影响后续的交换,但是在实际编写函数时,因为传入的参数本来就不会影响原来参数的值,因此不必考虑复原字符串的情况。
3、在进行交换时,要记得把与自己交换的情况考虑进去,不然会少掉情况。
代码
class Solution {
public:
vector<string> res;
// string path;
vector<string> Permutation(string str) {
if(str.size()==0) return res; //判断是否为空
dfs(str,0);
//字典顺序
sort(res.begin(),res.end());
return res;
}
void dfs(string str,int start){
//递归跳出的条件,只剩一个字符,无法进行交换
//递归结束时,将此字符串加入最后的字符串数组中
if(start==str.size()-1){
res.push_back(str);
return;
}
//进行交换
for(int i=start;i<str.size();i++){
if(str[start]==str[i]&&i!=start){
continue;
}
swap(str[i],str[start]);
dfs(str,start+1);
}
}
};