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