核心思路
只有两条规则:
- 左括号:只要没到 n,随便加
- 右括号 :必须 少于左括号 才能加(保证不出现
())这种非法情况)
回溯过程就是:
先加 (
尝试加 )
不行就回溯
凑够长度就保存
完整代码实现:
java
class Solution {
List<String> res = new ArrayList<>();
public List<String> generateParenthesis(int n) {
// 回溯:当前字符串、左括号数量、右括号数量、n
backtrack("",0,0,n);
return res;
}
public void backtrack(String path,int open,int close,int n){
// 出口:总长度 == 2 * n 说明凑够一对了
if(path.length() == 2*n){
res.add(path);
return;
}
//左括号没满 -> 可以加左括号
if(open < n){
backtrack(path + "(",open + 1,close,n);
}
if(close < open){
backtrack(path + ")",open,close + 1,n);
}
}
}
总结
左括号随便加,右括号只能比左括号少,凑够长度就是合法答案。