题目描述:给定一个数字
n
生成长度为n
的合法的括号字符串。
题目链接:Leetcode 22. Generate Parentheses
这个题目一看用递归,但是怎么剪枝呢?就是(
与)
的关系,右括号一定不能大于左括号数,最终两个数一定相等,左右括号数各为一半,因为只有一种括号,所以不用考虑([)]
这种情况。
代码如下
class Solution {
public List<String> generateParenthesis(int n) {
List<String> ans = new ArrayList<>();
dfs(ans, "(", n * 2, 1, 0);
return ans;
}
public void dfs(List<String> ans, String sb, int n, int nl, int nr) {
if (sb.length() > n) return;
if (sb.length() == n) {
ans.add(sb);
}
if (nr - nl > 0) {
return;
}
if (nl < n / 2) {
dfs(ans, sb + "(", n, nl + 1, nr);
}
if (nr < n / 2) {
dfs(ans, sb + ")", n, nl, nr + 1);
}
}
}
## 改进版记录左括号数 右括号数
class Solution:
def generateParenthesis(self, n: int) -> List[str]:
ans = []
self.dfs(ans,"(",2*n,1,0)
return ans
def dfs(self,ans,curr_s,l,nl,nr):
if len(curr_s) > l:
return
if len(curr_s) == l:
ans.append(curr_s)
return
if nr - nl > 0:
return
if nl< (l // 2):
self.dfs(ans,curr_s + "(",l,nl+1,nr)
if nr < (l // 2):
self.dfs(ans,curr_s + ")",l,nl,nr+1)