一、题目
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且有效的括号组合。
二、思路(来自题解)
先看一个例子:
总结出代码实现过程:
-
当前左、右括号的数量都大于 0 时,才产生树枝;
-
当前左括号的数量大于 0,产生左树枝;
-
当前右括号的数量大于左括号的数量,产生右树枝(代码实现时,我们用右括号的数量大于 0 来产生右树枝,用 left > right 来剪枝);
-
左、右括号的数量等于 0 的时候,到达叶子节点,括号组合生成。
三、代码
class Solution {
public List<String> generateParenthesis(int n) {
ArrayList<String> list = new ArrayList<>();
if(n == 0)
return list;
// 深度优先遍历,搜索可能的结果
dfs("", n, n, list);
return list;
}
public void dfs(String curStr, int left, int right, ArrayList<String> list){
// 因为每一次尝试,都使用新的字符串变量,所以无需回溯
if(left == 0 && right == 0){
list.add(curStr);
return;
}
// 剪枝
if(left > right)
return;
// 生左枝
if(left > 0)
dfs(curStr + "(", left - 1, right, list);
// 生右枝
if(right > 0)
dfs(curStr + ")", left, right - 1, list);
}
}