方法一:回溯法
思路
我们只在序列仍然保持有效时才添加 (
或 )
,可以通过跟踪目前放置的左括号和右括号的数目来做到这一点。
如果 (
数量不大于
n
n
n,我们可以放一个 (
。如果 )
数量小于 (
数量,我们可以放一个 )
。
代码
class Solution {
List<String> ans = new ArrayList<String>(); //结果数组
public List<String> generateParenthesis(int n) {
backtrack(new StringBuilder(), 0, 0, n);
return ans;
}
public void backtrack(StringBuilder cur, int open, int close, int max){
if(cur.length() == max * 2){ //终止条件
ans.add(cur.toString());
return;
}
if(open < max){ //左括号数量小于n
backtrack(cur.append('('), open + 1, close, max);
cur.deleteCharAt(cur.length() - 1); //回溯
}
if(close < open){ //右括号数量小于左括号数量
backtrack(cur.append(')'), open, close + 1, max);
cur.deleteCharAt(cur.length() - 1);
}
}
}