一、题目:22. 括号生成
二、题目解析:
改题属于回溯题目,首先我们应该知道,一个合法的括号需要满足两个条件:
1. 左右括号数量相等
2. 任意前缀中左括号的数量一定 >= 有括号的数量(也就是说一个右括号总能找到相匹配的左括号)
递归函数设计:
void backtracking(int n, List<String> result, int left, int right, String str)
n
是括号对数,result保存结果,left是左括号数量,right是右括号数量,str
是当前维护的合法括号序列。
搜索过程如下:
1、初始时定义序列的左括号数量 left 和右括号数量 right 都为0。
2、如果 right > left,直接返回。
3、当left == n && right == n 时,将当前合法序列str加入答案数组res中。
4、如果left < n 拼接左括号,如果right < left 拼接右括号。
三、代码如下:
public List<String> generateParenthesis(int n) {
List<String> result = new ArrayList<>();
backtracking(n, result, 0, 0, "");
return result;
}
private void backtracking(int n, List<String> result, int left, int right, String str) {
if (right > left) {
return;
}
if (left == n && right == n) {
result.add(str);
return;
}
if (left < n) {
backtracking(n, result, left+1, right, str+"(");
}
if (right < left) {
backtracking(n, result, left, right+1, str+")");
}
}
四、测试:
五、结束