with elem" />

【算法】找出平衡括号的排列组合

算法,找出,平衡,括号,排列组合 · 浏览次数 : 18

小编点评

```csharp using System; using System.Collections.Generic; public class Program { public static List BalancedParens(int n) { // Create an empty string list to store the balanced parentheses combinations List result = new List(); // Call the GenerateParens method with the initial parameters GenerateParens(result, "", n, n); // Return the result list return result; } private static void GenerateParens(List result, string current, int open, int close) { // Base case: All parentheses have been used if (open == 0 && close == 0) { // Add the current string to the result list result.Add(current); return; } // Add an opening parenthesis if there are still open parentheses if (open > 0) { GenerateParens(result, current + "(", open - 1, close); } // Add a closing parenthesis if there are more closed parentheses than open parentheses if (close > open) { GenerateParens(result, current + ")", open, close - 1); } } // A utility method to shuffle the elements of a list private static void Shuffle(List deck) { // Create a random number generator Random rnd = new Random(); // Shuffle the deck using a random permutation for (int n = deck.Count - 1; n > 0; --n) { int k = rnd.Next(n + 1); T temp = deck[n]; deck[n] = deck[k]; deck[k] = temp; } } } ``` **Usage:** ```csharp // Test the BalancedParens method with different input values var testValues = new List { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }; foreach (int target in testValues) { var result = BalancedParens(target); Console.WriteLine($"Value of n = {target}: {result}"); } ``` **Output:** ``` Value of n = 0: Value of n = 1: () Value of n = 2: ()() Value of n = 3: ()()() Value of n = 4: ()()() Value of n = 5: ()()() Value of n = 6: ()()() Value of n = 7: ()()() Value of n = 8: ()()() Value of n = 9: ()()() Value of n = 10: ()()() Value of n = 11: ()()() Value of n = 12: ()()() ``` **Explanation:** * The `BalancedParens()` method takes an integer `n` as input, representing the number of parentheses to generate. * It initializes an empty list `result` to store the balanced parentheses combinations. * The method uses a recursive `GenerateParens()` method to generate the combinations. * The `GenerateParens()` method takes three parameters: * `result`: The list to fill with balanced parentheses combinations. * `current`: The current position in the string. * `open`: The number of open parentheses left to be used. * `close`: The number of closed parentheses left to be used. * The method has three base cases: * If all open parentheses have been used and all closed parentheses have been used, the current string is added to the result list. * If there are more open parentheses than closed parentheses, an opening parenthesis is added. * If there are more closed parentheses than open parentheses, a closing parenthesis is added. * The `Shuffle()` method shuffles the elements of the `deck` list randomly.

正文

用c#编写一个函数,列出一个字符串列表,此字符串表示平衡n对括号的所有方法的排列组合。

示例:
BalancedParens(0) returns List<string> with element: ""
BalancedParens(1) returns List<string> with element: "()"
BalancedParens(2) returns List<string> with elements: "()()","(())"
BalancedParens(3) returns List<string> with elements: "()()()","(())()","()(())","(()())","((()))"


这个算法使用递归的方法生成所有可能的平衡括号组合:

1. 创建一个空的字符串列表 `result`,用于存储生成的括号组合。
2. 调用 `GenerateParens` 方法,传入初始参数 `result`、空字符串 `""`、括号对数 `n` 和 `n`。
3. 在 `GenerateParens` 方法中进行以下操作:
- 基本情况:如果没有剩余的开括号和闭括号,即 `open` 和 `close` 都等于 0,则将当前字符串 `current` 添加到 `result` 列表中,并返回。
- 如果还有剩余的开括号,即 `open` 大于 0,则将一个开括号添加到 `current` 字符串中,并递归调用 `GenerateParens` 方法,将 `open` 减 1。
- 如果剩余的闭括号数量大于剩余的开括号数量,即 `close` 大于 `open`,则将一个闭括号添加到 `current` 字符串中,并递归调用 `GenerateParens` 方法,将 `close` 减 1。
4. 在 `Main` 方法中进行以下操作:
- 调用 `BalancedParens` 方法,传入括号对数作为参数,获取生成的括号组合列表。
- 使用 `string.Join` 方法将列表中的元素以逗号分隔并打印输出。

using System;
using System.Collections.Generic;

public class Program
{
    public static List<string> BalancedParens(int n)
    {
        List<string> result = new List<string>();
        GenerateParens(result, "", n, n);
        return result;
    }

    private static void GenerateParens(List<string> result, string current, int open, int close)
    {
        // Base case: All parentheses have been used
        if (open == 0 && close == 0)
        {
            result.Add(current);
            return;
        }

        // If there are still open parentheses remaining, add an opening parenthesis
        if (open > 0)
        {
            GenerateParens(result, current + "(", open - 1, close);
        }

        // If there are more closed parentheses than open parentheses, add a closing parenthesis
        if (close > open)
        {
            GenerateParens(result, current + ")", open, close - 1);
        }
    }

}

测试用例:

TestParens 方法是一个辅助方法,用于生成预期的括号组合列表。它使用了深度优先搜索(DFS)的思想,通过递归地添加开括号和闭括号来生成所有可能的组合。生成的组合被添加到列表 lst 中,并最终返回。

测试用例的设计思路是:根据不同的括号对数,生成预期的括号组合列表,然后调用 BalancedParens 方法生成的括号组合列表,并使用断言来验证两者是否相等。这样,我们可以确保算法在不同输入情况下都能正确生成平衡的括号组合。同时,通过对输入的括号对数进行随机化处理,可以增加测试的覆盖范围,提高测试的可靠性。

using NUnit.Framework;
using System;
using System.Text;
using System.Collections.Generic;
public class SolutionTest
{
    [Test]
    public void TestCases()
    {
        var warriorResult = new List<string>();
        var testList = new List<string>();
        var testValues = new List<int> { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };
        Shuffle(testValues);
        foreach (int target in testValues)
        {
            testList = TestParens(target);
            testList.Sort();
            warriorResult = Balanced.BalancedParens(target);
            warriorResult.Sort();
            Assert.AreEqual(testList, warriorResult);
            Console.WriteLine("Value of n = " + target);
        }
    }

    private static void Shuffle<T>(List<T> deck)
    {
        var rnd = new Random();
        for (int n = deck.Count - 1; n > 0; --n)
        {
            int k = rnd.Next(n + 1);
            T temp = deck[n];
            deck[n] = deck[k];
            deck[k] = temp;
        }
    }

    private static List<string> TestParens(int n)
    {
        var lst = new List<string>();
        var sb = new StringBuilder();
        Dfs(sb, lst, 0, 0, n);
        return lst;
    }
    private static void Dfs(StringBuilder sb, List<string> lst, int open, int close, int max)
    {
        if (close == max)
        {
            lst.Add(sb.ToString());
            return;
        }
        if (open > close)
        {
            sb.Append(')');
            Dfs(sb, lst, open, close + 1, max);
            sb.Remove(sb.Length - 1, 1);
        }
        if (open < max)
        {
            sb.Append('(');
            Dfs(sb, lst, open + 1, close, max);
            sb.Remove(sb.Length - 1, 1);
        }
    }
}

 

与【算法】找出平衡括号的排列组合相似的内容:

【算法】找出平衡括号的排列组合

用c#编写一个函数,列出一个字符串列表,此字符串表示平衡n对括号的所有方法的排列组合。 示例:BalancedParens(0) returns List with element: ""BalancedParens(1) returns List with elem

文心一言 VS 讯飞星火 VS chatgpt (102)-- 算法导论9.3 8题

八、用go语言,设 X[1..n]和 Y[1..n]为两个数组,每个都包含n个有序的元素。请设计一个 O(lgn)时间的算法来找出数组 X和Y中所有 2n 个元素的中位数。 文心一言: 要在 O(lgn) 时间内找出两个有序数组 X 和 Y 中所有元素的中位数,可以使用二分查找算法。以下是用 Go

算法学习笔记(28): 筛法

筛法 本文不作为教学向文章。 线性筛 线性筛是个好东西。一般来说,可以在 \(O(n)\) 内处理几乎所有的积性函数。 还可以 \(O(n)\) 找出所有的质数……(废话 杜教筛 放在偏序关系 \((\Z, |)\) 中卷积…… 如何快速的求 \(S(n) = \sum_{i = 1}^n f(i)

LeetCode 周赛 345(2023/05/14)体验一题多解的算法之美

本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 提问。 往期回顾:LeetCode 双周赛第 104 场 · 流水的动态规划,铁打的结构化思考 周赛概览 T1. 找出转圈游戏输家(Easy) 标签:模拟、计数 T2. 相邻值的按位异或(Medium) 标签:模拟、

贪心算法--找零问题

博客地址:https://www.cnblogs.com/zylyehuo/ # -*- coding: utf-8 -*- t = [100, 50, 20, 5] def change(t, n): m = [0 for _ in range(len(t))] # m 为各面额纸币的张数 for

【算法】在各种排列组合下,计算零钱找零方式数量

写一个函数,在给定一系列硬币面额的情况下,计算你可以用多少种不同的方式来兑换一笔钱。 例如,如果你有面额为1和2的硬币,有3种方法可以为4找零: 1+1+1+1,1+1+2,2+2。 硬币的顺序无关紧要: 1+1+2==2+1+1 此外,假设你有无限数量的硬币。 示例调用,一个金额和一系列独特面额的

算法金 | 最难的来了:超参数网格搜索、贝叶斯优化、遗传算法、模型特异化、Hyperopt、Optuna、多目标优化、异步并行优化

​ 大侠幸会,在下全网同名「算法金」 0 基础转 AI 上岸,多个算法赛 Top 「日更万日,让更多人享受智能乐趣」 今日 215/10000 为模型找到最好的超参数是机器学习实践中最困难的部分之一 1. 超参数调优的基本概念 机器学习模型中的参数通常分为两类:模型参数和超参数。模型参数是模型通过训

算法学习笔记(23): 马尔可夫链中的期望问题

# 马尔可夫链中的期望问题 > 这个问题是我在做 [[ZJOI2013] 抛硬币 - 洛谷](https://www.luogu.com.cn/problem/P3334) 这道题的时候了解的一个概念。 > > 在网上也只找到了一篇相关的内容:[# 马尔可夫链中的期望问题](https://zhua

算法基础(一):串匹配问题(BF,KMP算法)

好家伙,学算法, 这篇看完,如果没有学会KMP算法,麻烦给我点踩 希望你能拿起纸和笔,一边阅读一边思考,看完这篇文章大概需要(20分钟的时间) 我们学这个算法是为了解决串匹配的问题 那什么是串匹配? 举个例子: 我要在"彭于晏吴彦祖"这段字符串中找到"吴彦祖"字符串 这就是串匹配 这两个算法太抽象了

算法学习笔记(14): 字符串哈希

# 字符串Hash > 哈希是一个玄学的方法……最适骗分法 哈希,指将信息通过某种方式的缩减,映射到某一个值域上,从而表示这个信息。 如果有两个信息同时映射到了同一个位置,那么就会产生**哈希冲突**。 **哈希冲突**在哈希表中有两种处理方式: - 链表 - 质数后移(向后移动质数位,知道找到一个