一、题目
括号生成
正整数 n 代表生成括号的对数,请设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
二、代码
没做出来呜呜😢
// 递归?
三、题解
class Solution {
public List<String> generateParenthesis(int n) { // generateParenthesis译为生成圆括号
List<String> combinations = new ArrayList<String>(); // List是一个接口,指的是集合,不能直接实例化;<>是泛型,里面指定了这个集合中存放的是什么类型的数据
generateAll(new char[2 * n], 0, combinations); // combinations译为组合数
return combinations;
}
public void generateAll(char[] current, int pos, List<String> result) {
if (pos == current.length) { // ***point:递归出口(递归算法要找好递归出口)
if (valid(current)) {
result.add(new String(current)); // 或者result.add(String.valueOf(current));
}
} else {
current[pos] = '(';
generateAll(current, pos + 1, result);
current[pos] = ')';
generateAll(current, pos + 1, result);
}
}
public boolean valid(char[] current) { // valid译为有效的
int balance = 0;
for (char c: current) {
if (c == '(') {
++balance;
} else {
--balance;
}
if (balance < 0) { // 左括号一定先出现,故balance一定大于等于0
return false;
}
}
return balance == 0;
}
}
作者:力扣官方题解
来源:力扣(LeetCode)
四、总结
思路:刚开始考虑用递归实现,于是手算在每一个n-1对儿基础上实现在外层和单独叠加一对儿括号,发现无法解决重复问题;后查看题解发现确实是要用递归思想,但是这里的递归是用于创建整个序列,而非焦点在每对儿括号上。故只要在创建完所有的序列后再将非法序列排除掉即可。
递归point:找好递归出口,按常规思想去写代码即可。
其他:Java char[]数组转成String类方法
① 使用 String 类的 String.valueOf(char) 方法
② 使用 Character 类的 Character.toString(char) 方法
③ 新new一个String类型对象:new String (char)