前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【力扣刷题】22. 括号生成

【力扣刷题】22. 括号生成

作者头像
jayjay
发布2022-11-02 16:52:20
2800
发布2022-11-02 16:52:20
举报
文章被收录于专栏:jay_blog

一、题目描述

来源:力扣(LeetCode)

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

示例 1:

代码语言:javascript
复制
输入:n = 3
输出:["((()))","(()())","(())()","()(())","()()()"]

示例 2:

代码语言:javascript
复制
输入:n = 1
输出:["()"]

提示:

  • 1 <= n <= 8

二、思路分析

使用回溯法,分成3种情况:

  1. 当左右括号剩余数量一样多时,必定只能选择(,且后续不可能能选),因为())是不合法的只能是()(,所以直接break,另外据此推论,在回溯过程中左括号数量一定小于等于右括号数量。
  2. 当左括号剩余数量大于0时且左右括号数量不等时,先选择左括号再选择右括号回溯(先右后左也可以)
  3. 当只有右括号时候,就直接选择,之后由于也没有其他选择直接break

三、代码实现

代码语言:javascript
复制
class Solution {
    private static final String[] parenthesis = {"(", ")"};
    public List<String> generateParenthesis(int n) {
        List<String> ans = new ArrayList<>();
        Map<String, Integer> parenthesisTimes = new HashMap<>();
        for (String ele: parenthesis) {
            parenthesisTimes.put(ele, n);
        }
        backtrack(ans, parenthesisTimes, new StringBuilder());
        return ans;
    }

    private void backtrack(List<String> ans, Map<String, Integer> remainParenthesis, StringBuilder sb) {
        if (remainParenthesis.get("(") == 0 &amp;&amp; remainParenthesis.get(")") == 0) {
            ans.add(sb.toString());
            return;
        }

        for (String ele: parenthesis) {
            if (remainParenthesis.get("(").intValue() == remainParenthesis.get(")").intValue()) {
                backtrackHelper(ans, sb, remainParenthesis, "(");
                break;
            } else if (remainParenthesis.get("(") > 0) {
                backtrackHelper(ans, sb, remainParenthesis, ele);
            } else {
                backtrackHelper(ans, sb, remainParenthesis, ")");
                break;
            }
        }
    }

    private void backtrackHelper(List<String> ans, StringBuilder sb, Map<String, Integer> remainParenthesis,
        String ele) {
        sb.append(ele);
        remainParenthesis.put(ele, remainParenthesis.get(ele) - 1);
        backtrack(ans, remainParenthesis, sb);
        sb.deleteCharAt(sb.length() - 1);
        remainParenthesis.put(ele, remainParenthesis.get(ele) + 1);
    }
}

四、运行结果

image.png
image.png

总结

考虑种类问题时,首先使用回溯算法,要明确怎么枝剪

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-03-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、题目描述
  • 二、思路分析
  • 三、代码实现
  • 四、运行结果
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档