递归:回溯法,括号生成
题目:https://www.nowcoder.com/practice/c9addb265cdf4cdd92c092c655d164ca?tpId=295&tqId=725&ru=/exam/oj&qru=/ta/format-top101/question-ranking&sourceUrl=%2Fexam%2Foj
生成括号一直是自己理不清楚的题目,总在想到底是怎么个回溯法。现在代码比较简洁,一眼就能看得明白。
首先定义一个res列表,接下来开始回溯。
回溯条件要有一个字符串str,左括号l,右括号r,输入的n,和res列表,接下来是判断条件,当字符串长度等于2n时说明括号数已经满足,加入res。
如果左括号l的个数小于n(注意这里是n也就是一半,自己体会)就继续回溯,回溯条件是str加入一个左括号,然后l+1.
如果右括号的数量小于左括号,那么有括号的数量理所应当也要加,回溯条件是str加一个右括号,然后r+1.
package com.kuang.reflection;
import java.util.*;
public class Test07 {
public ArrayList<String> generateParenthesis(int n) {
ArrayList<String> result = new ArrayList<>(10);
backtrack("", 0, 0, n, result);
return result;
}
private void backtrack(String string, int open, int close, int n, ArrayList<String> result) {
if (string.length() == n << 1) {
result.add(string);
return;
}
if (open < n) {
backtrack(string+"(", open+1, close, n, result);
}
if (close < open) {
backtrack(string+")", open, close+1, n, result);
}
}
public static void main(String[] args) {
System.out.println(10 >> 1);
}
}
