【程序员面试金典】【字符串】​面试题 08.09 - 括号

事实证明一次发多篇文章,后面的被疏漏的可能性很大,一直没有比较好的法子来规范这种算法文章,所以后面还是逐题发布吧,毕竟不是所有小伙伴都喜欢刷刷刷的~

一 目录

不折腾的前端,和咸鱼有什么区别

目录
一 目录
二 题目
三 解题思路
四 统计分析
五 解题套路

二 题目

括号。

设计一种算法,打印n对括号的所有合法的(例如,开闭一一对应)组合。

说明:解集不能包含重复的子集。

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

[
  "((()))",
  "(()())",
  "(())()",
  "()(())",
  "()()()"
]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/bracket-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
/**
 * @param {number} n
 * @return {string[]}
 */
var generateParenthesis = function(n) {

};

根据上面的已知函数,小伙伴们可以先尝试破解本题,确定了自己的答案后再看下面代码。

三 解题思路

这题可以用递归破解:

18:15 解法 1:递归

const generateParenthesis = (n) => {
  const result = [];
  // 递归取值
  const dfs = (cur, left, right) => {
    // 如果当前字符串的长度是 n * 2(即 n 对),收租
    if (cur.length === 2 * n) {
      result.push(cur);
      return;
    }
    // 左边起手
    if (left < n) {
      dfs(cur + '(', left + 1, right);
    }
    // 右边补足
    if (right < left) {
      dfs(cur + ')', left, right + 1);
    }
  };
  dfs('', 0, 0);
  return result;
};

是怎么个思路呢?假设我们传入的数字是 2:

  • ( ——> (( ——> (() ——> (())

  • ( ——> () ——> ()( —— > ()()

我们设置 3 个参数:

  • cur:当前字符串

  • left:左括号个数

  • right:右括号个数

万事我们从左开头:

if (left < n) {
  dfs(cur + '(', left + 1, right);
}

如果我们左边尚未补足,那么我们就新增左边参数。

然后,我们进一步补足右边参数:

// 右边补足
if (right < left) {
  dfs(cur + ')', left, right + 1);
}

那么,我们就会得到:

------
'' 0 0
------
( 1 0
------
(( 2 0
------
(() 2 1
------
(()) 2 2

这时候小伙伴脑子可能有点卡壳,第一种方法出来了,第二种是怎么出来的呢?

  • 首先,第一种结局 (()) 2 2 是从 (( 2 0 走出来的,意味着现在它完结了,我们就回退一层。

  • 然后,到了 ( 1 0 后,我们会走右边判断 0 < 1(right < left),所以我们会先走右边得到 () 1 1,然后进一步走出:

------
() 1 1
------
()( 2 1
------
()() 2 2

最后,这步走完了,我们再一次回退,发现是从 () 1 1 走出来的,那么再上一层就是 '' 0 0,无路可走,直接退出递归。

所以最后输出:

[ '(())', '()()' ]

以此类推,得到整个深度优先搜索的结果。

四 统计分析

本题不需要统计分析。

五 套路分析

本题暂未发现任何套路,如果有但是 jsliang 后面发现了的话,会在 GitHub 进行补充。

如果小伙伴有更好的思路想法,或者没看懂其中某种解法,欢迎评论留言或者私聊 jsliang~


不折腾的前端,和咸鱼有什么区别!

jsliang 会每天更新一道 LeetCode 题解,从而帮助小伙伴们夯实原生 JS 基础,了解与学习算法与数据结构。

浪子神剑 会每天更新面试题,以面试题为驱动来带动大家学习,坚持每天学习与思考,每天进步一点!

扫描上方二维码,关注 jsliang 的公众号(左)和 浪子神剑 的公众号(右),让我们一起折腾!

jsliang 的文档库 由 梁峻荣 采用 知识共享 署名-非商业性使用-相同方式共享 4.0 国际 许可协议进行许可。

基于https://github.com/LiangJunrong/document-library上的作品创作。
本许可协议授权之外的使用权限可以从 https://creativecommons.org/licenses/by-nc-sa/2.5/cn/ 处获得。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值