LeetCode刷题,移除无效的括号(1249)

473 阅读1分钟

移除无效的括号

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

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

解题代码

思路:我们只需要判断括号中出现的数量差值是否为0。如果左括号-右括号数量为0,那么代表能匹配所有括号,如果不能就删除括号即可

var minRemoveToMakeValid = function(s) {
  let res = "";
  let cnt = 0; // 记录差值
  let index = []; // 记录左括号出现的下标
  let continueNum = 0; // 记录右括号出现且差值小于等于0的次数
  for (let i = 0; i < s.length; i++) {
    const char = s[i];
    if (char === "(") {
      cnt += 1; // 遇见左括号 + 1
      res += char;
      index.push(i); // 记录所有左括号的位置
    } else if (char === ")") {
      if ( cnt <= 0 ) { 
        continueNum += 1; // 当差值为小于等于0时,出现右括号说明此时多了一个右括号、记录跳出的次数
        continue
      };
      cnt -= 1; // 遇见右括号 - 1,代表匹配完成一次
      index.shift(); // 删除已经匹配的左括号位置
      res += char;
    } else {
      res += char;
    }
  }
  res = res.split("");
  index.forEach(i => {
    res[i - continueNum] = ""; // 此时如果index中还有值,就是未匹配的左括号的下标,减去continueNum 是因为当右括号出现时,我们判断条件中有跳出循环这一块,所以字符串总长度会减少,下标也需要跟着减少。
  })
  return res.join(""); // 返回最后结果字符串
};