剑指offer——40字符串的排列

题目描述

输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。

输入描述:

输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。


题解:

  一种交换的递归,一种DFS

    交换法,是将i前半部分与i的后半部分交换,得到新的排列组合

    DFS,是使用一种选择字符串的顺序重新组成一个新的数组

  两种方法要用set存储来达到去重的效果,因为字符串中存在重复的字母

  

 1 class Solution01 {
 2 public:
 3     vector<string> Permutation(string str) {
 4         if (str.size() == 0)return {};
 5         set<string>res;
 6         DFS(str, 0, res);
 7         vector<string>resV;
 8         resV.assign(res.begin(), res.end());
 9         return resV;
10     }
11     void DFS(string str, int index, set<string>&res)
12     {
13         if (index >= str.length())
14             res.insert(str);
15         for (int i = index; i < str.length(); ++i)
16         {
17             swap(str[i], str[index]);
18             DFS(str, index + 1, res);
19             swap(str[i], str[index]);
20         }
21     }
22 };
23 
24 class Solution02 {
25 public:
26     vector<string> Permutation(string str) {
27         if (str.size() == 0)return {};
28         set<string>res;
29         string s = "";
30         vector<bool>v(str.length(), false);
31         DFS(str, s, v, res);
32         vector<string>resV;
33         resV.assign(res.begin(), res.end());
34         return resV;
35     }
36     void DFS(const string str,string s, vector<bool>&v,set<string>&res)
37     {
38         if (s.length() == str.length())
39         {
40             res.insert(s);
41             return;
42         }        
43         for (int i = 0; i < str.length(); ++i)
44         {
45             if (v[i] == false)
46             {
47                 v[i] = true;
48                 s += str[i];
49                 DFS(str,s, v, res);
50                 s.erase(s.length() - 1);
51                 v[i] = false;
52             }
53         }
54     }
55 };

 

  

posted @ 2019-10-16 22:01  自由之翼Az  阅读(102)  评论(0编辑  收藏  举报