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);
}
}
低调做人,高调做事。