剑指offer-字符串的排列

描述

输入一个字符串,打印出该字符串中字符的所有排列,你可以以任意顺序返回这个字符串数组。例如输入字符串abc,则按字典序打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。

输入描述:

输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
 
求解思路:
  1. 首先遇到重复问题,首先想到通过集合,以尝试解决字符重复的问题,简化问题。
  2. 然后就是比较简单的递归了:
    • 确定递归函数功能(有点类似DP中确定状态,不过一个是结果,一个是动作):返回第第 个字符字符到最后一个字符的全排列。
    • 确定出口和逻辑处理(可先画递归树结构寻找规律)。
代码:
 1 #include<iostream>
 2 using namespace std;
 3 #include<queue>
 4 #include<vector>
 5 #include<string>
 6 #include<set>
 7 
 8 class Solution {
 9 public:
10     //  通过集合解决重复的问题,简化问题
11     // 然后就是一个很简单的递归了。
12     vector<string> Permutation(string str) {
13         // 将集合转换为vector
14         vector<string> st;
15         if(str.empty()){
16             return st;
17         }
18         set<string> se=permaute(str);
19         set<string>::iterator ite=se.begin();
20         
21         for(;ite!=se.end();++ite){
22             st.push_back(*ite);
23         }
24         return st;
25     }
26     
27     // 每次递归,弄一个集合,然后返回上层递归时,将集合和当前字符组合
28     set<string> permaute(string remain){
29         set<string> curSet;
30         int len=remain.size();
31         if(len==1){
32             curSet.insert(remain);
33             return curSet;
34         } 
35         for(int i=0;i<len;++i){  
36             // 更新下一层的remain
37             string br=remain;
38             string::iterator ite=br.begin();
39             std::advance(ite,i);  // 向后移动i个位置
40             br.erase(ite);
41             // int a=1;
42             set<string> belowSet=permaute(br);
43             // 组合下一层的集合
44             set<string>::iterator site=belowSet.begin();
45             while(!belowSet.empty() && site!=belowSet.end()){
46                 curSet.insert(remain[i]+*site);
47                 ++site;    
48             }   
49         }
50         return curSet;
51     }
52 };
53 
54 int main() {
55     Solution* sol = new Solution();
56     string remain="ab";
57     vector<string> vs=sol->Permutation(remain);
58     vector<string>::iterator ite=vs.begin();
59     for(;ite!=vs.end();++ite){
60         string el=*ite;
61         for(int i=0;i<el.size();++i){
62             cout<<el[i];
63         } 
64         cout<<endl;
65     }
66     return 0;
67 }
 
心之所愿,永不相忘
原文地址:https://www.cnblogs.com/zgll/p/15070454.html