【数组】46. 全排列

题目:

 

 

 

解答:

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

 

posted @ 2020-05-05 21:07  梦醒潇湘  阅读(153)  评论(0)    收藏  举报