題目描述
輸入一個字符串,按字典序打印出該字符串中字符的所有排列。例如輸入字符串abc,則打印出由字符a,b,c所能排列出來的所有字符串abc,acb,bac,bca,cab和cba。
輸入描述:
輸入一個字符串,長度不超過9(可能有字符重復),字符只包括大小寫字母。
解題思路:本題求整個字符串的全排列可以看做兩步
1)首先求出所有可能出現在第一位置的字母,即begin與后面所有與它不同的字母進行交換
2)固定第一個字母,求后面字母的全排列,即遞歸此時begin = begin+1
1 #include <iostream> 2 #include <string> 3 #include <vector> 4 #include <algorithm> 5 using namespace std; 6 class Solution { 7 public: 8 vector<string> Permutation(string str) { 9 vector<string> a; 10 if(str.empty()) 11 return a; 12 Permutation(a,str,0); 13 sort(a.begin(),a.end());//按照字典序輸出 14 return a; 15 } 16 void Permutation(vector<string> &array, string str, int begin)//遍歷第begin位的所有可能性 17 { 18 //一次遍歷的結束條件 19 if(begin == str.size()-1) 20 { 21 array.push_back(str); 22 } 23 for(int i=begin;i<str.size();i++) 24 { 25 if(i!=begin && str[i] == str[begin]) 26 { 27 continue;//有與begin位重復的字符串不進行交換,跳過 28 } 29 swap(str[i],str[begin]); 30 //當i==begin時,也要遍歷其后面的所有字符 31 //當i!=begin時,先交換,使第begin位取到不同的可能字符,再遍歷后面的字符 32 Permutation(array,str,begin+1); 33 swap(str[i],str[begin]);//為了防止重復的情況,還需要將begin處的元素重新換回來 34 } 35 } 36 }; 37 int main() 38 { 39 string a = "abc"; 40 Solution s; 41 vector<string> b; 42 b = s.Permutation(a); 43 for(int i=0;i<b.size();i++) 44 { 45 cout<<b[i]<<endl; 46 } 47 return 0; 48 }