27、劍指offer--字符串的排列


題目描述
輸入一個字符串,按字典序打印出該字符串中字符的所有排列。例如輸入字符串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 }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM