题目:
给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。
示例:
输入:3
输出:
[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
代码:
public class Test6 {
@Test
public void test(){
List<String> strings = new Test6().generateParenthesis(1);
for (String string : strings) {
System.out.println(string);
}
}
public List<String> generateParenthesis(int n) {
List<String> temp = new ArrayList<>();
function(new StringBuilder(),n,n,temp);
List<String> result = new ArrayList<>();
for (String s : temp) {
char[] chars = s.toCharArray();
Stack<Character> stack = new Stack<>();
for (char aChar : chars) {
if (stack.isEmpty()) {
stack.push(aChar);
}else{
if (aChar=='(') {
stack.push(aChar);
}else{
if (stack.peek()=='(') {
stack.pop();
}
}
}
}
if (stack.isEmpty()) {
result.add(s);
}
}
return result;
}
public static void function(StringBuilder stringBuilder, int n1, int n2, List<String> result){
if (n1==0) {
for (int i = 0; i < n2; i++) {
stringBuilder.append(")");
}
result.add(stringBuilder.toString());
return;
}
if (n2==0) {
for (int i = 0; i < n1; i++) {
stringBuilder.append("(");
}
result.add(stringBuilder.toString());
return;
}
StringBuilder left = new StringBuilder(stringBuilder.toString());
function(left.append("("),n1-1,n2,result);
StringBuilder right = new StringBuilder(stringBuilder.toString());
function(right.append(")"),n1,n2-1,result);
}
}