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;
}
};
剑指Offer-38.字符串的排列
最新推荐文章于 2022-05-24 21:12:01 发布