数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
输入:左右括号的数量
输出:String列表
思路:使用回溯法,先append左括号,然后再append右括号,当左括号数量小于n时append,然后递归加回溯,右括号也同理。
class Solution {
//定义result列表
List<String> result = new ArrayList<>();
public List<String> generateParenthesis(int n) {
backTrack(n, 0 ,0 ,new StringBuilder());
return result;
}
public void backTrack(int n, int leftNum, int rightNum, StringBuilder sb){
//回溯终止条件
if(leftNum + rightNum == n * 2){
//表示左右括号已满
result.add(sb.toString());
return;
}
if(leftNum < n){
sb.append('(');
backTrack(n, leftNum + 1, rightNum, sb);
sb.deleteCharAt(sb.length() - 1);
}
if(rightNum < leftNum){
sb.append(')');
backTrack(n, leftNum , rightNum + 1, sb);
sb.deleteCharAt(sb.length() - 1);
}
}
}
此题在解的时候考虑到了回溯,但是关于在哪里递归和回溯没有搞明白,还有if(rightNum < leftNum)
,不用写成if(rightNum < n && rightNum < leftNum)