题目描述:
给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。
例如,给出 n = 3,生成结果为:
[
“((()))”,
“(()())”,
“(())()”,
“()(())”,
“()()()”
]
思想:
- 这种列出所有情况的考虑使用递归,由于只有左右字符串,所以最终生成的串必定n个左n个右括号
- 定义left和right表示左右括号的剩余数字,考虑非法情况…即剩余的左括号大于右括号,说明出现)(,非法,直接返回
- 合法递归停止条件:right和left均为0,递归结束,保存结果,进行返回
- 否则通过比较left与right和0的大小,进行递归,直到递归完毕产生所有合法的可能字符串
PS:主要考察递归的使用,注意List的使用和字符串拼接即可
import java.util.ArrayList;
import java.util.List;
public class test1 {
public static List<String> generateParentheses(int n){
List<String> res = new ArrayList<String>();
helper(n, n, "", res);
return res;
}
public static void helper(int left, int right, String out, List<String> res) {
//非法情况
if(left < 0 || right < 0 || right > left) return;
//合法,保存结果
if(left == 0 && right == 0) {
res.add(out);
return;
}
//递归
helper(left - 1, right, out + "(", res);
helper(left, right - 1, out + ")", res);
}
public static void main(String[] args) {
List<String> result = generateParentheses(3);
System.out.println(result);
}
}