面试题 08.08. 有重复字符串的排列组合【 力扣(LeetCode) 】

文章目录

零、原题链接

面试题 08.08. 有重复字符串的排列组合

一、题目描述

有重复字符串的排列组合。编写一种方法,计算某字符串的所有排列组合。

二、测试用例

示例 1:

cpp 复制代码
 输入:S = "qqe"
 输出:["eqq","qeq","qqe"]

示例 2:

cpp 复制代码
 输入:S = "ab"
 输出:["ab", "ba"]

提示:

cpp 复制代码
字符都是英文字母。
字符串长度在[1, 9]之间。

三、解题思路

  1. 基本思路:
      使用回溯法,在利用散列表去重
  2. 具体思路:
    • 编写 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;
    }
};
相关推荐
王德博客25 分钟前
【从基础到实战】STL string 学习笔记(上)
c++·笔记·学习
赴33535 分钟前
逻辑回归 银行贷款资格判断案列优化 交叉验证,调整阈值,下采样与过采样方法
算法·机器学习·逻辑回归·下采样·交叉验证·过采样·阈值
2501_9248787344 分钟前
无人机光伏巡检缺陷检出率↑32%:陌讯多模态融合算法实战解析
开发语言·人工智能·算法·视觉检测·无人机
沉睡的无敌雄狮1 小时前
无人机光伏巡检漏检率↓78%!陌讯多模态融合算法实战解析
人工智能·算法·计算机视觉·目标跟踪
Algebraaaaa1 小时前
C++ 中 NULL 与 nullptr 有什么区别?
开发语言·c++
magicwt1 小时前
《从零构建大模型》读书笔记
算法
大胖猫L1 小时前
深搜与广搜在 TypeScript 类型递归中的应用
前端·算法
2202_756749692 小时前
02 基于sklearn的机械学习-KNN算法、模型选择与调优(交叉验证、朴素贝叶斯算法、拉普拉斯平滑)、决策树(信息增益、基尼指数)、随机森林
python·算法·决策树·随机森林·机器学习·sklearn
ATaylorSu2 小时前
经典算法之美:冒泡排序的优雅实现
开发语言·笔记·学习·算法
菜鸡nan3 小时前
23th Day| 39.组合总和,40.组合总和II,131.分割回文串
算法·leetcode·职场和发展