【LeetCode】括号生成Java题解

872 阅读1分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

题目描述

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

有效括号组合需满足:左括号必须以正确的顺序闭合。

 

示例 1:

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

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/generate-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路分析

  • 今天的每日一题是括号生成问题,题干指出有效括号组合需满足:左括号必须以正确的顺序闭合。也就是说,生成括号的时候,需要考虑左右括号的顺序和数量。
  • 我们采用深度优化的思路解题,当左右括号数量为0的时候,递归终止。当剩余左括号数量大于剩余右括号数量的时候,不是有效的括号,递归终止。
  • 依次使用左括号,右括号,得到如下代码。

通过代码

class Solution {
    public List<String> generateParenthesis(int n) {
        List<String> ans = new ArrayList<>();
        if (n == 0) {
            return ans;
        }

        dfs("", n, n, ans);
        return ans;
    }

    public void dfs(String curStr, int left, int right, List<String> res) {
        if (left == 0 && right == 0) {
            res.add(curStr);
            return;
        }

        if (left > right) {
            return;
        }

        if (left > 0) {
            dfs(curStr + "(", left - 1, right, res);
        }
        if (right > 0) {
            dfs(curStr + ")", left, right - 1, res);
        }
    }
}

image.png

总结

  • 上述算法的时间复杂度是O(n), 空间复杂度是O(n)
  • 括号相关的题目还有有效括号的判断,可以一并练习一下,归纳总结,形成解一类题的思路和方法。
  • 坚持算法每日一题,加油!