移除无效的括号
给你一个由 '('、')' 和小写字母组成的字符串 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(""); // 返回最后结果字符串
};