Practice17:
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则按字典序打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母
S1
牛客解题之一:
递归法,使用集合set来避免重复排序;通过交换swap来达到固定某个字母,再让后续进行递归排序。
如图:
如图所示的全排列可以发现,
对于这个排列,我们是固定A不动,然后交换B与C,从而得到"ABC" 和 "ACB"
同理,对于"BAC"、"BCA" 、"CAB"和"CBA"是同样道理
递归三部曲:
- 递归函数的功能:
dfs(int pos, string s), 表示固定字符串s的pos下标的字符s[pos] - 递归终止条件:当
pos+1 == s.length()的时候,终止,表示对最后一个字符进行固定,也就说明,完成了一次全排列 - 下一次递归:
dfs(pos+1, s), 很显然,下一次递归就是对字符串的下一个下标进行固定
但是,对于"ABB"来说,就会有重复,如图
class Solution {
public:
void perm(int pos,string s,set<string>& res){
if(pos+1==s.length()){
res.insert(s);
return;
}
for(int i=pos;i<s.length();++i){
swap(s[pos],s[i]);
perm(pos+1,s,res);
swap(s[pos],s[i]);
}
}
vector<string> Permutation(string str) {
if(str.empty())return {};
set<string> res;
perm(0,str,res);
return vector<string>({res.begin(),res.end()});
}
};

2014

被折叠的 条评论
为什么被折叠?



