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/
分类:
leetcode
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具