1. 程式人生 > >【劍指offer】字符串的排列

【劍指offer】字符串的排列

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 16
void 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】字符串的排列