返回

JavaScript LeetCode 1021:删除最外层括号,解析巧妙,易懂易实现

前端

引言

在数据结构的海洋中,栈以其先进后出的特性独树一帜。当我们谈及括号匹配的问题时,栈便自然成为我们的首选工具。在 JavaScript 中,如何利用栈来删除 LeetCode 第 1021 题中字符串的最外层括号呢?

巧妙的栈应用

要判断一个括号是否是外层括号,有两个关键条件:

  • 压栈前栈为空,此时的左括号为最外层。
  • 压栈后栈为空,此时的右括号为最外层。

基于此,我们可以设计一个简洁高效的算法:

算法步骤:

  1. 初始化一个栈,记为 stack
  2. 遍历输入字符串中的每个字符 c
  3. 如果 c 是左括号 '(',则将 c 压入 stack
  4. 如果 c 是右括号 ')':
    • 如果 stack 不为空,则将 c 压入 stack
    • 如果 stack 为空,则说明 c 为最外层右括号,将其忽略。
  5. 返回 stack 中所有括号的连接。

代码实现:

/**
 * 删除字符串中最外层的括号
 * @param {string} s 输入字符串
 * @return {string} 删除最外层括号后的字符串
 */
const removeOuterParentheses = (s) => {
  const stack = [];
  let result = '';

  for (const char of s) {
    if (char === '(') {
      stack.push(char);
    } else if (char === ')') {
      if (stack.length > 0) {
        stack.pop();
      }
    }

    if (stack.length > 0) {
      result += char;
    }
  }

  return result;
};

实例解析

"(()())" 为例,该字符串包含一对最外层括号和一对内层括号。

  1. 当遇到第一个左括号时,将其压入栈中。
  2. 当遇到第一个右括号时,栈不为空,因此将其压入栈中。
  3. 当遇到第二个左括号时,将其压入栈中。
  4. 当遇到第二个右括号时,栈不为空,将其压入栈中。
  5. 当遍历完毕后,栈中还剩下两个括号,因此结果为 "()"

总结

通过巧妙地利用栈,我们可以轻松地删除字符串中最外层的括号。这种算法不仅简洁高效,而且易于理解和实现。对于其他涉及括号匹配的问题,这个算法同样适用。

关键词: