【LeetCode】Day43-括号生成

题目

22. 括号生成【中等】

题解

“排列” 类型的题要想到 回溯法

利用左右括号的数目解题是这题最好理解的一种解法:

  1. 左括号数目
    添加“(”
  2. 右括号数目<左括号数目
    添加“)”
  3. 终止条件
    (1)右括号数目>左括号数目,这时肯定不是有效括号了,返回
    (2)右括号数目==左括号数目==n,完成一组括号排列,返回
  4. 回溯的时候删掉末尾的括号,重来
class Solution {
    private List<String>res=new ArrayList<>();
    public List<String> generateParenthesis(int n) {
        backtracking(n,0,0,"");
        return res;
    }
    public void backtracking(int n,int left,int right,String str){
        if(right>left)
            return;
        else if(right==n&&left==n){
            res.add(str);
            return;
        }
        if(left<n){
            str+="(";
            backtracking(n,left+1,right,str);
            str=str.substring(0,str.length()-1);//回溯
        }
        if(right<left){
            str+=")";
            backtracking(n,left,right+1,str);
            str=str.substring(0,str.length()-1);
        }
    }
}

时间复杂度: O ( 4 n / n ) O(4^n/\sqrt{n}) O(4n/n )
在这里插入图片描述

空间复杂度: O ( n ) O(n) O(n),最多递归2n次,递归栈所需的空间

你可能感兴趣的:(Leetcode进阶之路,leetcode,java,算法)