![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/bb3430fa2890e312be1da9ee554116fd.png)
AC-Code
class Solution {
private:
bool nextPermutation(string& s) {
int i = s.size() - 2;
while (i >= 0 && s[i] >= s[i + 1]) {
i--;
}
if(i < 0) return false;
int j = s.size() - 1;
while (j >= 0 && s[i] >= s[j]) {
j--;
}
swap(s[i], s[j]);
reverse(s.begin() + i + 1, s.end());
return true;
}
private:
vector<string> ans;
vector<bool> vis;
void dfs(const string& src, int index, string&& temp) {
if(index == src.size()) {
ans.push_back(temp);
return;
}
for(int i = 0; i < src.size(); ++i) {
if (vis[i] || (i > 0 && !vis[i - 1] && src[i - 1] == src[i])) {
continue;
}
temp.push_back(src[i]);
vis[i] = true;
dfs(src, index + 1, move(temp));
temp.pop_back();
vis[i] = false;
}
}
public:
vector<string> permutation2(string s) {
vector<string> ret;
sort(s.begin(), s.end());
do {
ret.push_back(s);
} while (nextPermutation(s));
return ret;
}
vector<string> permutation(string s) {
sort(s.begin(), s.end());
vis.resize(s.size());
dfs(s, 0, move(""));
return ans;
}
};