字符串的排列_牛客题霸_牛客网 (nowcoder.com)
这是一道全排列问题,就是说字符串的每一位都要被用到,但是字符串可能存在重复问题,所以需要一步去重操作和BM56相似。
class Solution {
public:
void recurision(vector<string>& res, string& str, string& temp,
vector<int>& vis) {
if (temp.size() == str.size()) {
res.push_back(temp);
return ;
}
for (int i = 0; i < str.length(); i++) {
if (vis[i]) continue; //被使用过
if (i > 0 && str[i - 1] == str[i] &&
!vis[i - 1]) 当前的元素str[i]与同一层的前一个元素str[i-1]相同且str[i-1]已经用过了
continue;
vis[i] = 1;
temp.push_back(str[i]);
recurision(res, str, temp, vis);
vis[i] = 0;
temp.pop_back();
}
}
vector<string> Permutation(string str) {
sort(str.begin(), str.end()); //顺序排序
vector<int> vis(str.size(), 0); //辅助数组 判断有没有使用过
vector<string> res; //存放结果
string temp; //临时结果
recurision(res, str, temp, vis);
return res;
}
};