输入一个字符串,打印出该字符串中字符的所有排列。
你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。
思路:
记字符串的长度为n,则有n个位置,对于位置i,字符串里的每个字符都放一次,对于位置i+1,字符串除i位置的字符外,其他都放一次。当到达位置n时,则出现一个满足要求的答案。题目要求不能有重复元素,所以要去重。先把字符串排序,则相同的字符相邻。对于两个相同的字符,如果前一个使用过了,后面一个则不使用。即
vis[j - 1] && s[j - 1] == s[j]
代码:
class Solution {
public:
vector<string> rec;
vector<int> vis;
void backtrack(const string& s, int i, int n, string& perm) {
if (i == n) {
rec.push_back(perm);
return;
}
for (int j = 0; j < n; j++) {
if (vis[j] || (j > 0 && vis[j - 1] && s[j - 1] == s[j])) {
continue;
}
vis[j] = true;
perm.push_back(s[j]);
backtrack(s, i + 1, n, perm);
perm.pop_back();
vis[j] = false;
}
}
vector<string> permutation(string s) {
int n = s.size();
vis.resize(n);
sort(s.begin(), s.end());
string perm;
backtrack(s, 0, n, perm);
return rec;
}
};