题目:有重复字符串的排列组合

有重复字符串的排列组合。编写一种方法,计算某字符串的所有排列组合。示例1:
 输入:S = "qqe"
输出:["eqq","qeq","qqe"]

示例2:

 输入:S = "ab"
输出:["ab", "ba"]

提示:

字符都是英文字母。

字符串长度在[1, 9]之间。

分析

和昨天那道”无重复字符串的排列组合”类似,区别在于这道题的输入字符串中有重复的字符,还是使用回溯思想,回溯前先将字符串排好序,这样相同的字符位置就会是连续的,在循环遍历的时候判断一下字符是否重复,跳过重复字符即可,注意如果当前字符和上一字符相同,需要判断上一字符是否使用过,如果使用过则继续,没有使用过则跳过,这里可以选择时候可以选择使用过的跳过,也可以选择未使用过的跳过,都可以,只是一定要两者选其一。

代码

class Solution {
public:
vector<string> permutation(string S) {
sort(S.begin(), S.end());
string path;
used.resize(S.size(), false);
dfs(S, path);
return ret;
}

vector<string> ret;
vector<bool> used;
void dfs(string& S, string& path) {
if (path.size() == S.size()) {
ret.push_back(path);
return;
}

for (int i = 0, size = S.size(); i < size; ++i) {
if (i > 0 && S[i] == S[i-1] && !used[i-1]) continue;
// if (i > 0 && S[i] == S[i-1] && used[i-1]) continue;也可以
if (used[i]) continue;
used[i] = true;
path.push_back(S[i]);
dfs(S, path);
used[i] = false;
path.pop_back();
}
}

};

每日一题:有重复字符串的排列组合_C/C++