返回

JavaScript巧解LeetCode1249:从括号字符串移除无效括号

前端

概览

在解决leetcode 1249 题目时,我们必须从给定的字符串 s 中,移除最少数量的无效括号,使之成为有效字符串。

算法详解

思路分析

要解决这个问题,我们可以运用栈这种数据结构来辅助我们进行括号匹配。我们从左到右遍历字符串,遇到左括号时将其压入栈中,遇到右括号时,若栈中存在左括号,则将两个括号均弹出栈外,表示该对括号已匹配成功;若栈中不存在左括号,则当前右括号无效,需要将其移除。

在遍历完整个字符串后,如果栈中仍然存在未匹配的左括号,则需要将它们全部移除。

实现细节

/**
 * 移除无效括号,使其成为有效字符串
 *
 * @param {string} s 由'('、')'和小写字母组成的字符串
 * @return {string} 移除无效括号后的字符串
 */
const minRemoveToMakeValid = (s) => {
  const stack = [];
  const indicesToRemove = [];

  for (let i = 0; i < s.length; i++) {
    const char = s[i];
    if (char === '(') {
      stack.push(i);
    } else if (char === ')') {
      if (stack.length > 0) {
        stack.pop();
      } else {
        indicesToRemove.push(i);
      }
    }
  }

  while (stack.length > 0) {
    indicesToRemove.push(stack.pop());
  }

  let result = '';
  let index = 0;
  for (let i = 0; i < s.length; i++) {
    if (indicesToRemove.includes(i)) {
      continue;
    }
    result += s[i];
  }

  return result;
};

实例

const s1 = '))((';
console.log(minRemoveToMakeValid(s1)); // "()"

const s2 = '())()(';
console.log(minRemoveToMakeValid(s2)); // "()()()"

const s3 = '((()))'
console.log(minRemoveToMakeValid(s3)); // "((()))"

const s4 = '())(()))('
console.log(minRemoveToMakeValid(s4)); // "()()()"

总结

本指南深入分析了解决leetcode 1249题目的思路和具体实现方法,并通过清晰的实例演示了如何巧妙地运用JavaScript中的栈和贪心算法来移除无效的括号。希望这篇指南能够帮助你轻松掌握这一技能,在编程实践中游刃有余。