28-leetCode: 622. 设计循环队列

123 阅读1分钟

题目

给你一个由 '('、')' 和小写字母组成的字符串 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('');
};