22.括号生成
描述
给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。
实例
例如,给出 n = 3,生成结果为:
[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
题解
- 使用一个
char[]
描述当前的状态 - 使用
leftNum
和rightNum
描述当前已经使用的左括号和右括号数量 - 判断
leftNum
和rightNum
是否相同 - 若相同且
leftNum < n
则尝试添加一个左括号 - 若不相同,且
leftNum < n
则尝试添加一个左括号 - 若不相同,且
rightNum < n
则尝试添加一个右括号
- 若相同且
public static List<String> generateParenthesis(int n) {
List<String> result = new LinkedList<>();
char[] state = new char[n*2];
getAllPoss(n,0,0,state,result);
return result;
}
public static void getAllPoss(int n, int leftNum, int rightNum, char[] state,List<String> stringList){
if ((leftNum == n) && (rightNum == n)){
stringList.add(new String(state));
return;
}
char[] nowState = state.clone();
if (leftNum == rightNum){
if (leftNum < n){
state[leftNum + rightNum] = '(';
getAllPoss(n,leftNum+1,rightNum,state,stringList);
}
} else {
if (leftNum < n){
state[leftNum + rightNum] = '(';
getAllPoss(n,leftNum+1,rightNum,state,stringList);
}
if (rightNum < n){
state[leftNum + rightNum] = ')';
getAllPoss(n,leftNum,rightNum+1,state,stringList);
}
}
}