【劍指offer】字符串的排列
阿新 • • 發佈:2018-04-11
ret https 遍歷 log 順序 back perm 思路 span
原創博文,轉載請註明出處!
# 題目
輸入一個字符串,按字典序打印出該字符串中字符的所有排列。例如輸入字符串abc,則打印出由字符a,b,c所能排列出來的所有字符串abc,acb,bac,bca,cab和cba。
# 思路(遞歸)
分兩步求字符串的全排列:首先求所有可能出現在第一個位置的字符,即把第一個字符和後面所有的字符交換;然後固定第一個字符,求後面所有字符的全排列。
1 class Solution { 2 public: 3 vector<string> Permutation(string str) { 4 // 存儲結果5 vector<string> result; 6 // 邊界條件 7 if(str.size()==0) return result; 8 // 遞歸實現字符串的字典序全排列 9 Permutation(result, str, 0); 10 // 調整順序 11 sort(result.begin(), result.end()); 12 // 返回結果 13 return result; 14 } 15 16void Permutation(vector<string> &result, string str, int begin)//遍歷第begin位的所有可能性 17 { 18 // 遞歸出口 19 if(begin==str.size()-1) result.push_back(str); 20 21 for(int i=begin; i<=str.size()-1;++i) 22 { 23 // 去重 24 if(i!=begin && str[i]==str[begin]) continue; 25 26 // 全排列 27 swap(str[i], str[begin]); 28 Permutation(result, str, begin+1); 29 swap(str[i], str[begin]); 30 } 31 } 32 };
【劍指offer】字符串的排列