题目链接
题目内容
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
题目示例
输入:n = 3
输出:[“((()))”,“(()())”,“(())()”,“()(())”,“()()()”]
输入:n = 1
输出:[“()”]
题目提示
- 1 <= n <= 8
题目思路
我们可以递归生成所有可能的括号序列,然后一一确认是否为有效的括号组合
定义一个generate函数,内含参数char数组,起始位置,和存储所有组合的List,然后从第0位开始递归
如果我们的起始位置和char数组的长度相等,说明已经生成了待检验的括号组合,如果是有效的括号组合,就添加到结果List中
否则的话,我们先添加(括号,然后递归到下一个位置,然后再添加),再递归到下一个位置(具体的递归流程可以参考代码后的图片)
关于括号组合是否有效,我们先创建一个栈stack,然后遍历括号数组,如果是(就添加到栈内,如果是)括号就判断栈是否为空,如果是空说明不是有效的括号组合,如果不是空就从栈中删除一个元素
遍历完整个数组后,如果栈中还有剩余的(,说明不是有效的括号组合,否则就是有效的括号组合
代码实现
class Solution {
public static List<String> generateParenthesis(int n) {
List<String> result = new ArrayList<>();
generate(new char[n * 2],0 , result);
return result;
}
private static void generate(char[] chars, int position, List<String> result) {
if(position == chars.length){
if(valid(chars)){
result.add(new String(chars));
}
} else {
chars[position] = '(';
generate(chars,position + 1, result);
chars[position] = ')';
generate(chars, position + 1, result);
}
}
private static boolean valid(char[] chars) {
Stack<Character> stack = new Stack<>();
for (int i = 0; i < chars.length; i++) {
if(chars[i] == '('){
stack.add('(');
}
if(chars[i] == ')'){
if(stack.empty()){
return false;
} else {
stack.pop();
}
}
}
if(stack.empty()){
return true;
}
return false;
}
}