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:
[ "((()))", "(()())", "(())()", "()(())", "()()()" ]
先看看生成括号的规律。
n = 3, 即我们需要有 3个左括号,3个右括号。一开始,左右括号的个数都是0。
在生成的过程中,如果左右括号的个数相等了,那么下一个括号只能是左括号。
如果左右括号的个数不相等,下一个括号可以是左括号,也可以是右括号。
最后,等我们累计用掉,3个左括号,3个右括号的时候,一个合法的括号组合就生成了。
可以用回溯的方法来模拟括号的生成。
运行时间:
代码:
public class GenerateParentheses {
public List<String> generateParenthesis(int n) {
List<String> result = new ArrayList<>();
doGenerate(result, new StringBuilder(), 0, 0, n);
return result;
}
private void doGenerate(List<String> result, StringBuilder sb, int leftNum, int rightNum, int n) {
if (leftNum == n && rightNum == n) {
result.add((new StringBuilder(sb)).toString());
return;
}
if (leftNum == rightNum) {
sb.append('(');
doGenerate(result, sb, leftNum + 1, rightNum, n);
sb.deleteCharAt(sb.length() - 1);
} else {
if (leftNum < n) {
sb.append('(');
doGenerate(result, sb, leftNum + 1, rightNum, n);
sb.deleteCharAt(sb.length() - 1);
}
if (rightNum < n) {
sb.append(')');
doGenerate(result, sb, leftNum, rightNum + 1, n);
sb.deleteCharAt(sb.length() - 1);
}
}
}
}