前端算法面试必刷题系列[9]

287 阅读1分钟

这个系列没啥花头,就是纯 leetcode 题目拆解分析,不求用骚气的一行或者小众取巧解法,而是用清晰的代码和足够简单的思路帮你理清题意。让你在面试中再也不怕算法笔试。

15. 括号生成 (/generate-parentheses)

标签

  • 回溯法 DFS
  • 递归
  • 满二叉树
  • 中等

题目

leetcode 传送门

这里不贴题了,leetcode打开就行,题目大意:

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

相关知识

回溯三要素

  1. 选择
  2. 约束
  3. 目标

本题而言

  1. 选择: 只有2种,左 / 右
  2. 约束: 左括号多,才能选右,否则不成对(非法)
  3. 目标: 构建出一个长度为2n,的合法串,当做递归的出口就 ok 了

基本思路

这种排列组合问题基本一套回溯法就成。

  1. 记录左右括号数量, 当前字符串等于最终长度 2n(n 对有 2n 个 字符)
  2. 注意只有 左括号数 > 右括号数时,才能加右括号

写法实现

/**
 * @param {number} n
 * @return {string[]}
 */
var generateParenthesis = function(n) {
  const res = []

  let dfs = (leftNum, rightNum, curString) => {
    // 递归出口,当前字符串等于最终长度 2n(左右都成对)
    if (curString.length === 2 * n) {
      res.push(curString)
      return
    }
    if (leftNum < n) {
      dfs(leftNum + 1, rightNum, curString + '(')
    }
    if (leftNum > rightNum) {
      dfs(leftNum, rightNum + 1, curString + ')')
    }
  }
  dfs(0, 0, "")
  return res
};

年初六就来一题吧。

今天就到这儿,想跟我一起刷题的小伙伴可以加我微信哦 搜索我的微信号infinity_9368,可以聊天说地 加我暗号 "天王盖地虎" 下一句的英文,验证消息请发给我 presious tower shock the reiver monster,我看到就通过,暗号对不上不加哈