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

文章目录

一、题目

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

示例1:

输入:S = "qqe"

输出:["eqq","qeq","qqe"]

示例2:

输入:S = "ab"

输出:["ab", "ba"]

提示:

  • 字符都是英文字母。
  • 字符串长度在[1, 9]之间。

点击此处跳转题目

二、C# 题解

同题目 LeetCode 面试题 08.07. 无重复字符串的排列组合,进行剪枝:

  1. 元素 S[i] 与 S[n] 相同时,舍去;
  2. 所得为新结果时,才纳入 ans。

步骤 1 剪枝不完全,所以还需加上步骤 2。

csharp 复制代码
public class Solution {
    public string[] Permutation(string S) {
        List<string> ans = new List<string>();
        Partition(ans, new StringBuilder(S), 0);
        return ans.ToArray();
    }

    public void Partition(List<string> ans, StringBuilder sb, int n) {
        if (n == sb.Length) {
            ans.Add(sb.ToString());
            return;
        }
        HashSet<char> hs = new HashSet<char>();
        for (int i = n; i < sb.Length; i++) {
            if (hs.Contains(sb[i])) continue;
            hs.Add(sb[i]);
            (sb[i], sb[n]) = (sb[n], sb[i]);
            Partition(ans, sb, n + 1);
            (sb[i], sb[n]) = (sb[n], sb[i]);
        }
    }
}
  • 时间:140 ms,击败 71.43% 使用 C# 的用户
  • 内存:46.7 MB,击败 92.86% 使用 C# 的用户

另一种剪枝方式,用一个 Set 集合存放已经交换过的重复元素,即不让当前 S[n] 与已经交换过的字母再进行交换:

csharp 复制代码
public class Solution {
    public string[] Permutation(string S) {
        List<string> ans = new List<string>();
        Partition(ans, new StringBuilder(S), 0);
        return ans.ToArray();
    }

    public void Partition(List<string> ans, StringBuilder sb, int n) {
        if (n == sb.Length) { // 递归出口
            ans.Add(sb.ToString());
            return;
        }
        HashSet<char> hs = new HashSet<char>(); // 记录已交换过的元素
        for (int i = n; i < sb.Length; i++) {
            if (hs.Contains(sb[i])) continue;   // 该元素已被交换过,则跳过
            hs.Add(sb[i]);                      // 添加记录
            (sb[i], sb[n]) = (sb[n], sb[i]);
            Partition(ans, sb, n + 1);
            (sb[i], sb[n]) = (sb[n], sb[i]);
        }
    }
}
  • 时间:128 ms,击败 100.00% 使用 C# 的用户
  • 内存:46.38 MB,击败 78.57% 使用 C# 的用户
相关推荐
贾斯汀玛尔斯7 小时前
每天学一个算法--LSM-Tree(Log-Structured Merge Tree)
java·算法·lsm-tree
浅念-11 小时前
刷穿LeetCode:BFS 解决 Flood Fill 算法
数据结构·c++·算法·leetcode·职场和发展·bfs·宽度优先
hixiong12311 小时前
C# OpenvinoSharp使用DINOv2模型进行图像相似度计算
开发语言·c#
做cv的小昊12 小时前
【TJU】研究生应用统计学课程笔记(8)——第四章 线性模型(4.1 一元线性回归分析)
笔记·线性代数·算法·数学建模·回归·线性回归·概率论
贾斯汀玛尔斯12 小时前
每天学一个算法--倒排索引(Inverted Index)
算法·inverted-index
小e说说12 小时前
打破偏科困境:这些学习软件助孩子重燃学习热情
算法
我命由我1234512 小时前
程序员的心理学学习笔记 - 空杯心态
经验分享·笔记·学习·职场和发展·求职招聘·职场发展·学习方法
月昤昽13 小时前
autoCAD二次开发 4.正多边形与collection区分
算法·c#·二次开发·autocad二次开发
休息一下接着来13 小时前
C++ 固定容量环形队列实现
c++·算法