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

LeetCode-22括号生成

作者头像
用户3470542
发布2019-06-26 16:04:47
4620
发布2019-06-26 16:04:47
举报
文章被收录于专栏:算法半岛

> 题目:22. 括号生成

> 难度:中等

> 分类:字符串

> 解决方案:链表的遍历

今天我们学习第22题括号生成,这是一道中等题。像这样字符串的题目经常作为面试题来考察面试者算法能力和写代码能力,因此最好能手写出该题。下面我们看看这道题的题目描述。

题目描述

给出 n代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。

例如,给出 n=3,生成结果为:

代码语言:javascript
复制
[  "((()))",  "(()())",  "(())()",  "()(())",  "()()()"]

分析

这个题是递归方面的题,对于递归不太熟悉的小伙伴可以扫描文章下方的二维码,关注『 算法半岛』回复『 数据结构目录』,即可获得相关学习资料。

对于递归的问题,我们需要明白以下三点:

  • 一个问题的解可以分解为几个子问题的解:对于这个括号生成的题,当 n=3时问题的解可以分成 n=2时问题的解;
  • 子问题除了数据规模不同,求解思路完全一样:对于这个括号生成的题,当 n=3时问题的解的解思路和 n=2时问题的解的解思路完全一样,只是问题规模减小了;
  • 必须存在递归终止条件:对于这个括号生成的题,我们需要使用两个变量 leftright来记录可使用的左括号数和右括号数,如当 n=3时,初始化 left=3right=3,当 left>right时说明可以使用的左括号数大于可以使用的右括号数,即已经使用的右括号数比左括号数多,则会出现无效的括号对数,因此 left>right可作为本题的递归终止条件。还有当 left<0right<0也是递归终止条件。

上述分析所对应的 java代码如下所示:

代码语言:javascript
复制
class Solution {
    public List<String> generateParenthesis(int n) {        List<String> res = new ArrayList<String>();        helper(n, n, "", res);        return res;    }
    // 递归辅助函数    private void helper(int left, int right, String out, List<String> res){        // 递归终止条件        if (left < 0 || right < 0 || left > right)            return ;        // 当left和right都为0时,保存有效的括号组        if(left == 0 && right == 0){            res.add(out);            return ;        }
        // 减小问题的规模        helper(left-1, right, out + "(", res);        helper(left, right-1, out + ")",res);    }}

执行用时 : 2 ms, 在Generate Parentheses的Java提交中击败了94.93% 的用户

内存消耗 : 35.7 MB, 在Generate Parentheses的Java提交中击败了100.00% 的用户

Github地址

LeetCode-22 括号生成:https://github.com/JacobLei/leetcode/blob/master/src/main/java/A22_GenerateParentheses.java

参考链接

括号生成:https://leetcode-cn.com/problems/generate-parentheses/

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-06-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 算法半岛 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目描述
  • 分析
  • Github地址
  • 参考链接
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档