[路飞]_1249. 移除无效的括号

112 阅读1分钟

「这是我参与2022首次更文挑战的第19天,活动详情查看:2022首次更文挑战

1249. 移除无效的括号

给你一个由 '('、')' 和小写字母组成的字符串 s。

你需要从字符串中删除最少数目的 '(' 或者 ')' (可以删除任意位置的括号),使得剩下的「括号字符串」有效。

请返回任意一个合法字符串。

有效「括号字符串」应当符合以下 任意一条 要求:

空字符串或只包含小写字母的字符串 可以被写作 AB(A 连接 B)的字符串,其中 A 和 B 都是有效「括号字符串」 可以被写作 (A) 的字符串,其中 A 是一个有效的「括号字符串」

「示例1:」
输入:s = "lee(t(c)o)de)"
输出:"lee(t(c)o)de"
解释:"lee(t(co)de)" , "lee(t(c)ode)" 也是一个可行答案。
「示例2:」
输入:s = "a)b(c)d"
输出:"ab(c)d"
「示例3:」
输入:s = "))(("
输出:""
解释:空字符串也是有效的
「示例4:」
输入:s = "(a(b(c)d)"
输出:"a(b(c)d)"
提示:」
  1. 1 <= s.length <= 10^5
  2. s[i] 可能是 '('')' 或英文小写字母

解题思路

1. 由题意我们可知,题目是让我们修改字符串,最后返回一个拥有完整括号(成对出现)的字符串
2. 我们可以遍历题目给定的数组,如果数组的等于'(‘我们则把当前下标push到一个空的变量里面保存
3. 直到便利到另外的一个‘)‘,我们把之前的下标删除掉,否则的话res数组的该位置的内容设置为空字符串
4. 最后我们遍历保存下标的数组,把数组里面的下标在题目给的变量数组里面对应的值设置为空字符串
5. 最后拼接一个res数组即可

代码实现

/**
 * 1249. 移除无效的括号
 * @param {string} s
 * @return {string}
 */
var minRemoveToMakeValid = function (s) {
  let stack = [];
  let res = s.split("");
  for (let i = 0; i < res.length; i++) {
    if (res[i] == "(") stack.push(i);
    if (res[i] == ")") {
      if (stack.length > 0) {
        stack.pop();
      } else {
        res[i] = "";
      }
    }
  }
  for (let i = 0; i < stack.length; i++) {
    res[stack[i]] = "";
  }
  return res.join("");
};

如果你对这道题目还有疑问的话,可以在评论区进行留言;