解法一:完全按照之前回溯法专题总结中,有重复元素数组的全排列方法来做,string也可以看做是一种数组
(因为一开始陷入了对未排序 string 进行回溯+剪枝的思路,尝试了引入set等方法都半途折戟。最后还是要排序)
class Solution {
public:
vector<string> permutation(string s) {
sort(s.begin(), s.end());
string cur = "";
vector<bool> visited(s.length(), false);
dfs(s, cur, visited);
return ans;
}
void dfs(string& s, string& cur, vector<bool>& visited) {
if(cur.length() == s.length()) {
ans.push_back(cur);
return;
}
for(int i = 0; i < s.length(); i++) {
if(visited[i] || (i>0 && s[i]==s[i-1] && !visited[i-1])) {
continue;
}
//cur += s[i];
cur.push_back(s[i]);
visited[i] = true;
dfs(s, cur, visited);
//cur -= s[i];
cur.pop_back();
visited[i] = false;
}
}
private:
vector<string> ans;
};
解法二:交换