https://leetcode.com/problems/generate-parentheses/description/
输入: 数字 n
处理: n 对括号()的排列
输出: 所有成对的结果
思路: n 对括号,字符串长度就是2*n,每位是(或),由于 n 是参数动态的,所以不能采取循环,只能采取递归回溯实现,过程中需要剪枝.预处理左括号是1,右括号是-1,这样只要最终每位之和等于0就匹配了
剪枝条件:
- 当前总和=0时,下一位只能是1,因为如果是-1后面再多都不会匹配
- 当前总和<0时,直接剪枝
- 当前总和>n时,直接剪枝,因为后面即使都是-1,总和也是大于0的
- 当前总和=n时,下一位只能是-1,因为如果是1,总和不会=0
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 
 | class Solution {
 char[] arr={'(',')'};
 int[] values={1,-1};
 List<String> res;
 
 public List<String> generateParenthesis(int n) {
 res= new ArrayList<String>();
 fun(0,n,0,new StringBuilder());
 return res;
 }
 private void fun(int i,int n,int sum,StringBuilder sb){
 if(i==n*2){
 if(sum==0){
 res.add(sb.toString());
 }
 return;
 }
 if(sum == 0){
 sum = call(i,arr[0],values[0],sb,sum,n);
 }else if(sum>0){
 if(sum > n){
 return;
 }else if(sum < n){
 sum = call(i,arr[0],values[0],sb,sum,n);
 }
 sum = call(i,arr[1],values[1],sb,sum,n);
 }
 
 }
 private int call(int i,char c,int val,StringBuilder sb,int sum,int n){
 sb.append(c);
 sum+=val;
 fun(i+1,n,sum,sb);
 sb.deleteCharAt(sb.length()-1);
 sum-=val;
 return sum;
 }
 }
 
 |