Leetcode 22.括号生成

85 阅读1分钟

题目

这道题有两种写法,分别是用dfs和bfs来解决。

Leetcode 22.括号生成

image-20220504215610139.png

DFS写法

先说说dfs写法吧,整体是使用递归来编写。

思路:

  1. 只要还有左括号就可以使用左括号
  2. 只要右括号数量大于左括号就可以使用右括号
  3. 只要字符串长度等于2n就存入数组

代码

/**
 * @param {number} n
 * @return {string[]}
 */
var generateParenthesis = function(n) {
  let res = []
  const dfs = (l, r, str) => {
      console.log(l, r, str);
      console.log(str.length)
      if(str.length == 2 * n) {
          res.push(str)
          return
      }
      if(l > 0) {
          dfs(l - 1, r, str + '(')
      }
      if(r > l) {
          dfs(l, r - 1, str + ')')
      }
  }
  dfs(n, n, '')
  return res
};

BFS写法

BFS写法用到了Set对象,set对象数据结构和数组比较相似,但是set对象里不能有重复的元素,如果你添加了重复的元素,set对象会自动帮你去重。

思路

  1. 当 n = 1 时,结果为 ["()"]
  2. 当 n = 2 时, 我们可以往 n = 1 时的结果里不同的位置插入“()”,可以得出结果["()()", "(())", "()()"],去重后的结果是["()()", "(())"]
  3. 以此类推

代码

/**
 * @param {number} n
 * @return {string[]}
 */
var generateParenthesis = function(n) {
  let set = new Set(['()'])
  let newSet
  for(let i = 2; i <= n; i++) {
       newSet = new Set()
      for(let s of set) {
          for(let j = 0; j < s.length; j++) {
              newSet.add(s.slice(0, j) + '()' + s.slice(j))
          }
      }
      set = newSet
  }
  return [...set]
};