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

文章目录

一、题目

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

示例1:

输入:S = "qqe"

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

示例2:

输入:S = "ab"

输出:"ab", "ba"

提示:

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

  点击此处跳转题目。

二、C# 题解

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

  1. 元素 Si 与 Sn 相同时,舍去;
  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 集合存放已经交换过的重复元素,即不让当前 Sn 与已经交换过的字母再进行交换:

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# 的用户
相关推荐
秋天的怀念_David1 小时前
算法一千零一夜 · 作品相关:版权与致谢声明
程序人生·算法·学习方法
信息安全失业大专人员1 小时前
每日了解一个智能体-WorkBuddy
开发语言·ai·c#·智能体
揽星河..2 小时前
【C语言】数组
c语言·开发语言·算法
careathers2 小时前
【数据结构】基于比较的排序算法 - 选择排序
数据结构·算法·排序算法
呆呆敲代码的小Y2 小时前
【实战精选面试题】C# 面试题详细解答,按难易程度排序
android·java·游戏·c#·游戏开发·unity面试题·c#面试题
听风若依2 小时前
C++模板初阶
c++·算法
淡海水3 小时前
09-01-内存-Unity资源生命周期全景
unity·c#·游戏引擎·.netcore·gc
纪念 2293 小时前
C++ 算法(模拟)
开发语言·c++·算法
揽星河..3 小时前
【C语言】函数
c语言·算法
zwc32104320553 小时前
Day 2:图像内存、数据类型与stride
c++·人工智能·opencv·算法·计算机视觉