输入一个字符串,打印出该字符串中字符的所有排列。
你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。
示例:
输入:s = “abc”
输出:[“abc”,“acb”,“bac”,“bca”,“cab”,“cba”]
限制:
1 <= s 的长度 <= 8
这道题模板跟46.全排列一样。主要是考察回溯算法。
需要注意的是两个点。
首先我们要设置一个sign数组来表示该字母是否已经被访问过。
然后我们在每一次往临时string扔字母进行回溯后,要记得删除这个字母——以便针对下一个字母进行回溯而不造成重复添加字母的问题。
因为输入的字符串可能存在相同字母的情况,所以结果有重复的。我们需要设置一个set进行去重,然后再将set的结果倒进vector里输出即可。
然后从这道题,我才知道,原来string变量也可以像vector一样进行push_back和pop_back操作。
class Solution {
public:
vector<string> permutation(string s) {
vector<string> ans;
string tmp;//答案string 可能存在多个
vector<int> sign(s.size(),0);//判断是否该字母被遍历到
huisu(ans,s,tmp,sign);
set<string> se(ans.begin(),ans.end());
ans.assign(se.begin(),se.end());
return ans;
}
void huisu(vector<string> &a,string &n,string tmp,vector<int> & sign){
if(tmp.size()==n.size()){
a.push_back(tmp);
}
for(int i=0;i<n.size();i++){
if(sign[i]==1){
continue;
}
else {
tmp.push_back(n[i]);
sign[i]=1;
huisu(a,n,tmp,sign);
sign[i]=0;
//tmp.erase(tmp.size()-1,1);
tmp.pop_back();//回溯的关键!
}
}
}
};