题目
给你一个由 '('、')' 和小写字母组成的字符串 s。
你需要从字符串中删除最少数目的 '(' 或者 ')' (可以删除任意位置的括号),使得剩下的「括号字符串」有效。
请返回任意一个合法字符串。
有效「括号字符串」应当符合以下 任意一条 要求:
空字符串或只包含小写字母的字符串 可以被写作 AB(A 连接 B)的字符串,其中 A 和 B 都是有效「括号字符串」 可以被写作 (A) 的字符串,其中 A 是一个有效的「括号字符串」
示例
输入:s = "lee(t(c)o)de)"
输出:"lee(t(c)o)de"
解释:"lee(t(co)de)" , "lee(t(c)ode)" 也是一个可行答案。
解题思路
本题也是一个需要使用到栈的基础题,定义一个用来存放需要删除括号的下标的栈,遍历字符串转成的数组,遇到左括号将对应下标进栈,遇到右括号判断栈中有无值,有则出栈一个,没有则删除当前元素,遍历结束后,遍历栈,删除数组在栈中的下标对应的值,最后筛选出非空字符连接成字符串即可
/**
* @param {string} s
* @return {string}
*/
var minRemoveToMakeValid = function(s) {
// 定义用来存放下标的栈
const stack = [];
// 将字符串转为数组,主要是个人比较喜欢操作数组
const arr = [...s];
for(let i = 0; i < arr.length; i++) {
// 左括号直接将下标push进栈
if (arr[i] === '(') {
stack.push(i)
}
// 右括号需要判断栈中是否有匹配的左括号,没有则直接删除
if (arr[i] === ')') {
stack.length ? stack.pop() : (delete arr[i]);
}
}
// 如果遍历完,栈中有值,遍历删除栈中的值
console.log(stack)
while(stack.length) {
delete arr[stack[0]];
stack.shift();
}
// 需要去除删除的undefind字符
return arr.filter(val => val).join('');
};