字符串的排列

 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 };
原文地址:https://www.cnblogs.com/pacino12134/p/11164165.html