LeetCode 22. 括号生成

169 阅读1分钟

22. 括号生成

难度 中等

数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。

示例 1:

输入:n = 3
输出:["((()))","(()())","(())()","()(())","()()()"]

示例 2:

输入:n = 1
输出:["()"]

提示:

  • 1 <= n <= 8

题解

这道题是要让我们枚举所有正常的括号序列,那还是需要用的枚举方法,这里我使用递归枚举方法,这种方法可以搜索所有结果集,然后加上判断,就可以找到所有正常的括号序列。

那第一步是怎么进行搜索是关键,因为左括号''('',必须在做在左,先枚举左括号,然后再枚举右括号”)“

正常的括号有些限制条件

  • 左括号或右括号个数不能超过括号的对数n
  • 枚举的时候,右括号一定小于等于左括号数量,保证括号对的正确性
  • 当以上条件都满足,左右括号都等于括号对数时,满足题目要求
class Solution {
    List<String> list = new ArrayList<String>();//结果集
    public List<String> generateParenthesis(int n) {
        char[] temp = new char[n * 2];//辅助字符串
        dfs(n, 0, 0, 0, temp);
        return list;
    }
    
   
    //n为括号对数
    //idx为当前temp辅助数组枚举到那个位置
    //left左括号数量
    //right右括号数量
    //temp辅助数组
    void dfs(int n, int idx, int left, int right, char[] temp){
        if(right == n && left == n){//左右括号都等于括号对数时,满足题目要求
            list.add(new String(temp));
            return;
        }
        if(left < n){//先枚举左括号,且左括号数量一定小于n
            temp[idx] = '(';
            dfs(n, idx + 1, left + 1, right, temp);
        }
        if(left > right){//枚举右括号,右括号一定小于等于左括号数量
            temp[idx] = ')';
            dfs(n, idx + 1, left, right + 1, temp);
        }
    }
}