38. 字符串的排列
输入一个字符串,打印出该字符串中字符的所有排列。
你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。
示例:
输入:s = "abc"
输出:["abc","acb","bac","bca","cab","cba"]
解题思路
回溯法:
将每个字符都都放到第一个位置一次,然后递归后续的所有字符,直到所有的节点都分配完成,结果是n!个,且均不重复
class Solution {
public:
vector<string> permutation(string s) {
int n = s.size();
visit.resize(n);
sort(s.begin(), s.end());
string perm;
backtrack(s, 0, n, perm);
return res;
}
private:
vector<string> res;
vector<int> visit;
void backtrack(const string& s, int i, int n, string& perm) {
if(i == n) {
res.push_back(perm);
return;
}
for(int j = 0; j < n; j++) {
if(visit[j] || (j > 0 && !visit[j - 1] && s[j - 1] == s[j])) {
continue;
}
visit[j] = true; //每个字符都放到固定的位置一次,分配后面的位置,这样的就是n!个结果了
perm.push_back(s[j]);
backtrack(s, i+1, n, perm);
perm.pop_back();
visit[j] = false;
}
}
};