解题思路:
可以看到是一个全排列的问题,所以很显然用到回溯法,问题是重复的元素要去除。
因此,我们需要先将字符串排序,将重复的字符放到一起;再加一个规则,就是重复的字符,下标i的字符使用了以后才可以使用下标i+1的字符。
class Solution {
public:
vector<string>vec;
vector<string> Permutation(string str) {
sort(str.begin(),str.end());
vector<bool>visited(str.size(),false);
string s;
help(str,visited,s);
return vec;
}
void help(const string& str,vector<bool> visited,string s){
if(s.size()==str.size()){
vec.push_back(s);
return;
}
for(int i=0;i<str.size();++i){
//1 i这个位置用过了,跳过
//2 i这个位置没用过,i>0,并且i-1也没用过,并且两个位置字符相等
// 我们规定,字符相等的必须先用前面的,才可以用后面的
if(visited[i]||(i>0&&!visited[i-1]&&str[i]==str[i-1]))
continue;
visited[i]=true;
s.push_back(str[i]);
help(str,visited,s);
s.pop_back();
visited[i]=false;
}
}
};