题目描述:
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
示例 1:
输入:n = 3
输出:["((()))","(()())","(())()","()(())","()()()"]
示例 2:
输入:n = 1
输出:["()"]
提示:
1 <= n <= 8
解题思路:
可以使用回溯解决该问题,再写程序的时候需要开两个计数器来记录当前串中左右括号的个数,并通过这个来进行回溯。
代码:
public class LC22 {
//回溯。
public List<String> generateParenthesis(int n) {
List<String> ansList = new ArrayList<>();
generate(ansList, "", 0, 0, n);
return ansList;
}
//leftcnt代表目前字符串中左括号的个数,rightcnt代表目前字符串中右括号的个数
//确保里面先添加的是"(",然后利用左右两个括号的个数,来进行递归
private void generate(List<String> ansList, String s, int leftcnt, int rightcnt, int n) {
//结束当前层递归的条件,注意当左右括号个数都超过n时,就不能在递归下去了
//如果当前右括号的个数比左括号的个数多,那肯定时不匹配的,所以直接返回上层
if (leftcnt > n || rightcnt > n || rightcnt > leftcnt){
return;
}
//如果目前左右括号个数都是n,那一定是括号匹配的,我们将其加入List中
if (leftcnt == n && n == rightcnt){
ansList.add(s);
}
//当左括号的个数大于右括号的个数时,我们就可以往深层递归了,注意一定是先添加左括号再添加右括号
//注意这里如果不加这个if判断的话,执行用时会多很多
if (leftcnt >= rightcnt){
generate(ansList, s + "(", leftcnt+1, rightcnt, n);
generate(ansList, s + ")", leftcnt, rightcnt + 1, n);
}
}
public static void main(String[] args) {
LC22 obj = new LC22();
List<String> list = obj.generateParenthesis(4);
System.out.println(list);
}
}

3937





