

1 class Solution {
2 public:
3 vector<string> Permutation(string str) {
4 if(str.size()==0) return res;
5 change(str,res,0);
6 //此时得到的result中排列并不是字典顺序,可以单独再排下序
7 sort(res.begin(),res.end());
8 return res;
9 }
10 void change(string str,vector<string> &result,int begin){
11 //递归结束条件:索引begin已经遍历到了最后的位置
12 if(begin==str.size()-1){
13 if(find(result.begin(),result.end(),str) == res.end()){
14 // 如果result中不存在str,才添加;避免aa和aa重复添加的情况
15 result.push_back(str);
16 }
17 }
18 else{
19 for(int i=begin;i<str.size();i++){
20 // 第一次循环i与begin相等,相当于第一个位置自身交换,关键在于之后的循环
21 swap(str[i],str[begin]);
22 // 之后i != begin,则会交换两个不同位置上的字符,直到begin==str.size()-1,进行输出;
23 change(str,result,begin+1);
24 // 复位,用以恢复之前字符串顺序,达到第一位依次跟其他位交换的目的
25 swap(str[i],str[begin]);
26 }
27 }
28 }
29 private:
30 vector<string> res;
31 };