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:
"((()))", "(()())", "(())()", "()(())", "()()()"
思路:backtracking, 注意 rightRemain < leftRemain这个条件的判断,因为不能出现 )(, 剩下的右括号必须大于左括号,换句话说,就是括号必须以左边开始,那么必须先写左边的括号,然后写右边的括号,那么正常情况下:leftRemain > rightRemain,如果不成立那么出现违法括号直接return;
class Solution {
public List<String> generateParenthesis(int n) {
List<String> list = new ArrayList<String>();
StringBuilder sb = new StringBuilder();
dfs(list, sb, n, n);
return list;
}
private void dfs(List<String> list, StringBuilder sb, int leftremain, int rightremain) {
if(leftremain < 0 || rightremain < 0 || leftremain > rightremain) {
return;
}
if(leftremain == 0 && rightremain == 0) {
list.add(new String(sb.toString()));
return;
}
if(leftremain > 0) {
sb.append("(");
dfs(list, sb, leftremain - 1, rightremain);
sb.deleteCharAt(sb.length() - 1);
}
if(rightremain > 0) {
sb.append(")");
dfs(list, sb, leftremain, rightremain - 1);
sb.deleteCharAt(sb.length() - 1);
}
}
}