文章目录
零、原题链接
一、题目描述
有重复字符串的排列组合。编写一种方法,计算某字符串的所有排列组合。
二、测试用例
示例 1:
cpp
输入:S = "qqe"
输出:["eqq","qeq","qqe"]
示例 2:
cpp
输入:S = "ab"
输出:["ab", "ba"]
提示:
cpp
字符都是英文字母。
字符串长度在[1, 9]之间。
三、解题思路
- 基本思路:
使用回溯法,在利用散列表去重 - 具体思路:
- 编写
dfs
函数- 如果字符串每个位置的元素都确定,则记录字符串到答案中。
- 创建散列表
- 确定第
k
个位置的字符,从第k+1
到尾部选取一个字符进行交换- 如果散列表中存在该字符,表示重复,则跳过
- 散列表记录该字符
- 与第
k
个位置的字符交换 - 递归确定第
k+1
个字符 - 恢复状态
- 调用
dfs
函数,返回结果。
- 编写
四、参考代码
时间复杂度: O ( n ! ) \Omicron(n!) O(n!)【n 是字符串长度】
空间复杂度: O ( n ) \Omicron(n) O(n)
cpp
class Solution {
public:
string str;
vector<string> ans;
void dfs(const int& k) {
if (k == str.length()) {
ans.emplace_back(str);
return;
}
vector<bool> m(128, false);
for (int i = k; i < str.length(); i++) {
if (m[str[i]])
continue;
m[str[i]] = true;
swap(str[k], str[i]);
dfs(k+1);
swap(str[k], str[i]);
}
}
vector<string> permutation(string S) {
str = S;
dfs(0);
return ans;
}
};