数字 n
代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
思路分析
- 我们需要维护两个变量 open 和 close,分别表示当前可以放置的左括号和右括号的数量。
- 当 open 小于n 时, 我们可以放置一个左括号,并递归调用函数,同时 open+1。
- 当 close小于open时, 我们可以放置一个右括号,并递归调用函数,同时 close+1。
- 当前字符串长度的等于n*2时, 说明我们找到了一个有效的括号组合,将其加入结果集中
直接给出代码:
import java.util.ArrayList;
import java.util.List;
public class no_22 {
public static void main(String[] args) {
List<String> re = generateParenthesis(3);
for (String s : re) {
System.out.print(s + " ");
}
}
public static List<String> generateParenthesis(int n) {
List<String> re = new ArrayList<>();
backTrack(re, "", n, 0, 0);
return re;
}
// 两个变量 open 和 close,分别表示当前可以放置的左括号和右括号的数量
public static void backTrack(List<String> re, String currentParenthesis, int n, int open, int close) {
if (currentParenthesis.length() == 2 * n) {
re.add(currentParenthesis);
return;
}
if (open < n) {
backTrack(re, currentParenthesis + "(", n, open + 1, close);
}
if (close < open) {
backTrack(re, currentParenthesis + ")", n, open, close + 1);
}
}
}
要注意的是,currentParenthesis不能修改,也就是说,这个变量自始至终都是"",只是在反复递归调用的时候修改了函数层面的值,而不是本身字符串的值被修改了。