题目描述
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
输入描述:
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
解题思路
(1) 先确定递归结束的条件,例如本题中可设begin == str.size() - 1;
(2) 形如 aba 或 aa 等特殊测试用例的情况,vector在进行push_back时是不考虑重复情况的,需要自行控制;
(3) 输出的排列可能不是按字典顺序排列的,可能导致无法完全通过测试用例,考虑输出前排序,或者递归之后取消复位操作。
1 vector
class Solution {
public:
vector<string> Permutation(string str) {
vector<string> result;
if(str.empty()) return result;
Permutation(str, result, 0);
sort(result.begin(),result.end());
return result;
}
void Permutation(string str, vector<string> &result, int begin) {
if(begin == str.size()-1 && find(result.begin(),result.end(),str) == result.end())
result.push_back(str);
else {
for(int i=begin; i<str.size(); ++i) {
if(i!=begin && str[begin]==str[i]) continue;
swap(str[i],str[begin]);
Permutation(str,result,begin+1);
swap(str[i],str[begin]);
}
}
}
/*void swap(char &fir,char &sec) {
char temp = fir;
fir = sec;
sec = temp;
}*/
};
2 set去重
class Solution {
public:
void PermutationCore(set<string> &res,string &str,int count,int start){
if(count==str.size()){
res.insert(str);
return;
}
for(int i=start;i<str.size();i++){
swap(str[start],str[i]);
PermutationCore(res,str,count+1,start+1);
swap(str[start],str[i]);
}
}
vector<string> Permutation(string str) {
set<string> res;
if(str.empty()) return {};
PermutationCore(res,str,0,0);
return vector<string>(res.begin(),res.end());
}
};