LeetCode22:括号生成
一、解题思路
1、解法1
可以选择将所有的组合都列举出来,然后判断是否符合要求,将符合要求的返回
具体过程如下所示
2、解法2
其实上述解法1是复杂度很高的,有些在遍历的过程中就已经不合理了
按照要求,如果要得到符合要求的括号,则一个字符串中
① ‘(’的数量不会大于一半
② 如果在下一个还有元素的情况下,‘)’的数量不会超过‘(’
所以就可以提前判断是否合理,步骤如下图
二、代码实现
1、解法1
public void generList(char[] current, int ptr, ArrayList result){
// 使用递归,必须有终止条件
if (ptr == current.length) {
if (isVaild(current)){
result.add(new String(current));
}
}
// 递归条件
else{
current[ptr] = '(';
generList(current, ptr+1, result);
current[ptr] = ')';
generList(current, ptr+1, result);
}
}
// 判断是否是有效的括号
public boolean isVaild(char[] s){
int ans = 0;
for (char c : s) {
if (c=='(') ans ++;
if (c==')') ans --;
if (ans<0) return false;
}
return ans==0;
}
2、解法2
public void generList2(ArrayList rest, StringBuffer str, int left, int right, int index){
if (str.length() == index*2){
rest.add(str.toString());
}
if (left<index){
str.append('(');
generList2(rest, str, left+1, right, index);
str.deleteCharAt(str.length()-1);
}
if (right<left){
str.append(')');
generList2(rest, str, left, right+1, index);
str.deleteCharAt(str.length()-1);
}
}