【数组】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 };

浙公网安备 33010602011771号