标签:
递归
题目:
给出n对括号,请编写一个函数来生成所有的由n对括号组成的合法组合。
例如,给出n=3,解集为:
“((()))”, “(()())”, “(())()”, “()()()”, “()(())”
数据范围:0 \le n \le 100≤n≤10
示例1
输入:1
返回值:[“()”]
示例2
输入:2
返回值:[“(())”,“()()”]
反思:
相当于一共nnn个左括号和nnn个右括号,可以给我们使用,我们需要依次组装这些括号。每当我们使用一个左括号之后,就剩下n−1n-1n−1个左括号和nnn个右括号给我们使用,结果拼在使用的左括号之后就行了,因此后者就是一个子问题,可以使用递归:
终止条件: 左右括号都使用了n个,将结果加入数组。
本级任务: 每一级就是保证左括号还有剩余的情况下,使用一次左括号进入子问题,或者右括号还有剩余且右括号使用次数少于左括号的情况下使用一次右括号进入子问题。
但是这样递归不能保证括号一定合法,我们需要保证左括号出现的次数比右括号多时我们再使用右括号就一定能保证括号合法了,因此每次需要检查左括号和右括号的使用次数。
//使用一次左括号
if(left < n){
recursion(left + 1, right, temp + "(", res, n);
}
//使用右括号个数必须少于左括号
if(right < n && left > right){
recursion(left, right + 1, temp + ")", res, n);
}
用到的知识点:
递归
代码:
public class Solution {
/**
*
* @param n int整型
* @return string字符串ArrayList
*/
public ArrayList<String> generateParenthesis(int n) {
// write code here
ArrayList<String> list = new ArrayList<>();
recurse(0, 0, new String(), list, n);
return list;
}
public void recurse(int left, int right, String str, ArrayList<String> list,
int n) {
if (left == n && right == n) {
list.add(str);
return;
}
// 进一次左括号
if (left < n ) {
recurse(left + 1, right, str + "(", list, n);
}
// 进一次右括号
if (right < n && left > right) {
recurse(left, right + 1, str + ")", list, n);
}
}
}