题目描述
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
输入描述:
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
思路:回溯法,排列树。由于字符有重复,所以要去重;由于要按字典序打印,所以最后要排序
1 class Solution { 2 public: 3 void backtrace(string &str, vector<string> &res, int n) 4 { 5 if(n==str.size()) 6 { 7 res.push_back(str); 8 return; 9 }else{ 10 for(int i=n; i<str.size(); ++i) 11 { 12 if(i!=n && str[i]==str[n])continue;//去重 13 char tmp=str[n];//交换 14 str[n]=str[i]; 15 str[i]=tmp; 16 backtrace(str, res, n+1);//递归 17 tmp=str[n];//换回来 18 str[n]=str[i]; 19 str[i]=tmp; 20 } 21 } 22 } 23 vector<string> Permutation(string str) { 24 vector<string> res; 25 if(str.size()==0)return res; 26 backtrace(str, res, 0); 27 std::sort(res.begin(), res.end());//排序 28 return res; 29 } 30 };