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# 的用户
相关推荐
EanoJiang38 分钟前
仿神秘海域/美末环境交互的程序化动画学习
游戏·c#
快去睡觉~6 小时前
力扣73:矩阵置零
算法·leetcode·矩阵
岁忧6 小时前
(nice!!!)(LeetCode 每日一题) 679. 24 点游戏 (深度优先搜索)
java·c++·leetcode·游戏·go·深度优先
小欣加油6 小时前
leetcode 3 无重复字符的最长子串
c++·算法·leetcode
环球经济报7 小时前
知行社黄剑杰:金融跨界,重塑震区救援新章
职场和发展
猿究院--王升9 小时前
jvm三色标记
java·jvm·算法
一车小面包9 小时前
逻辑回归 从0到1
算法·机器学习·逻辑回归
妮妮学代码9 小时前
c#:TCP服务端管理类
java·tcp/ip·c#
SchuylerEX10 小时前
第六章 JavaScript 互操(2).NET调用JS
前端·c#·.net·blazor·ui框架
tt55555555555511 小时前
字符串与算法题详解:最长回文子串、IP 地址转换、字符串排序、蛇形矩阵与字符串加密
c++·算法·矩阵