22. 括号生成 Generate Parentheses

Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses.

Input: n = 3
Output: ["((()))","(()())","(())()","()(())","()()()"]

 

方法一:

递归+遍历。

申请2n长度的字符数组

每位分别赋值为左右括号,当长度为2n时判断是否合法

复制代码
public List<String> generateParenthesis(int n) {
        List<String> ans = new ArrayList<>();
        generate(ans, new char[2 * n ], 0);
        return ans;
    }
    public void generate(List<String> ans, char[] cur, int n){
        if( n == cur.length)
        {
            if(valid(cur)){
                ans.add(new String(cur));
            }  
            return;
        }else{
            cur[n] = '(';
            generate(ans, cur, n + 1);
            cur[n] = ')';
            generate(ans , cur, n + 1);
        }

    }
    public boolean valid(char []cur){
        int balance = 0;
        for(char c: cur){
            if(c == '('){
                balance += 1;
            }else{
                balance -= 1;
            }
            if(balance < 0) return false;
        }
        return balance == 0;
    }
复制代码

 

方法二:

     回溯法,添加左括号的规则是左括号数量小于n。添加右括号的规则是右括号小于左括号。

    当然方法一也可以增加添加括号规则。

复制代码
public List<String> generateParenthesis(int n) {
        List<String> ans = new ArrayList<>();
        backtrack(ans, new StringBuilder(), 0 ,0 , n);
        return ans;
        
    }
    public void backtrack(List<String> ans, StringBuilder cur, int left, int right, int max){
        if(cur.length() == 2 * max){
            ans.add(cur.toString());
            return;
        }
        if (left < max){
            cur.append('(');
            backtrack(ans, cur, left + 1, right, max);
            cur.deleteCharAt(cur.length() - 1);
        }
        if( right < left ){
            cur.append(')');
            backtrack(ans, cur, left, right + 1, max);
            cur.deleteCharAt(cur.length() - 1);
        }
    }
复制代码

 

参考链接:

https://leetcode.com/problems/generate-parentheses/

https://leetcode-cn.com/problems/generate-parentheses/

posted @   diameter  阅读(97)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示