剑指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 };