用JavaScript刷leetcode第1021题-删除最外层括号

417 阅读2分钟

一、前言

一听到括号两个字,第一反应估计都是用栈,找到最外层的括号删掉就好了。那问题来了,如何判断是最外层的括号?

  • 压栈栈为空,此时的左括号即为最外层
  • 压栈栈为空,此时的右括号即为最外层 我们也可以反方向思考,找到不是最外层的括号拼接。这道题,我将不用栈数据结构解,但是本质上还是栈的思想来解。
  • 压栈可以看成+1,出栈可以代表-1

二、题目描述

原谅我比较懒,我直接从leetcode截图,来看咱们的题目描述了哈,欲知更加清楚的描述,请看leetcode题目链接

image.png

三、分析

核心思想:

  1. 遇见左括号cnt+1, 若cnt>1时,说明此左括号不是最外层括号,故将其拼接到ret上
  2. 遇见右括号cnt-1, 若cnt>0时,说明此右括号不是最外层括号,故将其拼接到ret上

具体步骤:

  • cnt计数, cnt初始为0
  • ret保存 删除最外层括号后的结果, 初始化为''
  • 遍历传入字符串
  • 遇见左括号cnt+1, 若cnt>1时,说明此左括号不是最外层括号,故将其拼接到ret上
  • 遇见右括号cnt-1, 若cnt>0时,说明此右括号不是最外层括号,故将其拼接到ret上
  • 返回ret

四、代码

git代码链接

/**
 * @param {string} s
 * @return {string}
 */
const removeOuterParentheses = function(s) {
  // cnt计数, cnt初始为0
  let cnt = 0
  // ret保存 删除最外层括号后的结果, 初始化为''
  let ret = ''
  // 遍历传入字符串
  for(const val of s) {
    if(val === '(' ) {
      // 遇见左括号cnt+1
      cnt++
      // 若cnt>1时,说明此左括号不是最外层括号,故将其拼接到ret上
      cnt > 1 && (ret += val)
    } else {
      // 遇见右括号cnt-1
      cnt--
      // 若cnt>0时,说明此右括号不是最外层括号,故将其拼接到ret上
      cnt > 0 && (ret += val)
    }
  }
  // 返回ret
  return ret
};