LeetCode No22. 括号生成
题目
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
示例 1:
输入:n = 3
输出:["((()))","(()())","(())()","()(())","()()()"]
示例 2:
输入:n = 1
输出:["()"]
提示:
1 <= n <= 8
解题思路
回溯
合法的括号肯定是先写一个左括号,然后再加一个右括号,我们可以利用这一特性用DFS的方式去模拟所有可能的组合。
递推打表
很容易就可以想到,n=2时所有合法的串都是在n=1时合法的串的基础上再添加一个合法的"()"得来的,也就是求合法串长度为n的过程其实就可以做一个递推的打表,可惜我代码功力还是差了一点,官方的题解太强了。
AC代码
回溯
点击查看代码
class Solution {
List<String> res;
StringBuffer sb;
private void DFS(int left, int rigth, int n, StringBuffer sb) {
if( left == n && rigth == n ) {
res.add(sb.toString());
return ;
}
// 左括号个数小于右括号个数,此串不合法,回溯至上一步
if( left<rigth ) {
return ;
}
if( left<n ) {
sb.append("(");
DFS(left+1, rigth, n, sb);
sb.deleteCharAt(sb.length()-1);
}
if( rigth<n ) {
sb.append(")");
DFS(left, rigth+1, n, sb);
sb.deleteCharAt(sb.length()-1);
}
}
public List<String> generateParenthesis(int n) {
res = new ArrayList<>();
sb = new StringBuffer();
DFS(0, 0, n, sb);
return res;
}
}
递推打表
点击查看代码
class Solution {
ArrayList[] cache = new ArrayList[100];
public List<String> generate(int n) {
if (cache[n] != null) {
return cache[n];
}
ArrayList<String> ans = new ArrayList<String>();
if (n == 0) {
ans.add("");
} else {
for (int c = 0; c < n; ++c) {
for (String left: generate(c)) {
for (String right: generate(n - 1 - c)) {
ans.add("(" + left + ")" + right);
}
}
}
}
cache[n] = ans;
return ans;
}
public List<String> generateParenthesis(int n) {
return generate(n);
}
}
低调做人,高调做事。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!