22. Generate Parentheses
Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses.For example, given n = 3, a solution set is:
[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
产生圆括号的合法序列
注意,左括号的数不能大于右括号,要不然那就意味着先尝试了右括号而没有左括号,类似“)(” 这种解是不合法的。
import java.util.ArrayList;
public class Solution {
public ArrayList<String> generateParenthesis(int n) {
ArrayList<String> res = new ArrayList<String>();
char[] tmpRes = new char[n + n];
dfsGenerate(n, n, "", res);
// dfsGenerate(n, n, tmpRes, 0, res);
return res;
}
// 剩余的左括号一定是小于右括号的
public void dfsGenerate(int left, int right, String str, ArrayList<String> res) {
if (left == 0 && right == 0) {
res.add(str);
return;
}
if (left > 0) {
dfsGenerate(left - 1, right, str + '(', res);
}
if (right > left) {
dfsGenerate(left, right - 1, str + ')', res);
}
}
public void dfsGenerate(int left, int right, char[] tmpRes, int idx, ArrayList<String> res) {
if (left > right)// 处理)(这种情况
return;
if (left == 0 && right == 0) {
res.add(new String(tmpRes));
return;
}
if (left > 0) {
tmpRes[idx] = '(';
dfsGenerate(left - 1, right, tmpRes, idx + 1, res);
}
if (right > 0) {
tmpRes[idx] = ')';
dfsGenerate(left, right - 1, tmpRes, idx + 1, res);
}
}
}