字符串的排列
题目描述
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
输入描述
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
解题思路
- 全排列问题,用递归的方法
- 固定当前第一个字符,求后面的全排列,再把它和后面的一个交换,再求全排列
- 对于有相同元素的情况,如果当前和后面的元素相同,就不交换它们
- 虽然不交换相同的元素,但还是有可能会产生相同的全排列,所以先把生成的全排列放到set中,去重,再作为输出
class Solution {
public:
vector<string> Permutation(string str) {
if(str.empty() ) return ans;
else{
int nsize=str.length();
Permutation(str,nsize,0);
}
for(auto it=us.begin();it!=us.end();it++){
ans.push_back(*it);
}
return ans;
}
void Permutation(string str,int nsize,int n){
if(n==nsize-1){//递归结束条件
us.insert(str);
}else{
Permutation(str,nsize,n+1);
for(int i=n;i<str.length();i++){
if(str[i]!=str[n]){
swap(str[i],str[n]);//与后面一个元素交换,再求其全排列
Permutation(str,nsize,n+1);
swap(str[i],str[n]);//交换回去,在递归树中就表现为回退到父节点
}
}
}
}
private:
vector<string>ans;
set<string>us;
};