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

128 阅读1分钟

题目描述

leetcode1249. 移除无效的括号

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

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

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

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

空字符串或只包含小写字母的字符串 可以被写作 ABA 连接 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 <= s.length <= 10^5
  • s[i] 可能是 '('')' 或英文小写字母

JavaScript实现

/**
 * @param {string} s
 * @return {string}
 */
var minRemoveToMakeValid = function(s) {
    // 解决方法1,通过正序逆序遍历去掉不合法的括号
    // let arr = [],count = 0;
    // // 遍历去除多余的’)‘
    // for(let i = 0; i < s.length; i ++){
    //     if(s[i] == '(' || s[i] != ')'){
    //         count += s[i] == '(';
    //         arr.push(s[i])
    //     }else {
    //         // 如果count==0,代表括号不合法,也就是说’)‘多,多出的不被push(实现剔除多余右括号)
    //         if(count) {
    //             count -= 1;
    //             arr.push(')')
    //         }
    //     }
    // }
    // //console.log('count',count);// 这时,如果count 不为0那么就代表有多余的’(‘
    // if(count == 0) return arr.join('');
    // // 第二次遍历去除多余 ’(‘, -逆序遍历
    // let ret = []
    // for(let i = arr.length - 1, count=0; i >= 0; i --){
    //     if(arr[i] == ')' || arr[i] != '('){
    //         count += arr[i] == ')';
    //         ret.unshift(arr[i])
    //     }else {
    //         if(count) {
    //             count -= 1;
    //             ret.unshift('(')
    //         }
            
    //     }
    // }
    // return ret.join('');

    // 解决方法2 通过栈的思路
    // 定义ret 模拟栈操作
    //  遇到( 进栈 ; 
    // 遇到 )出栈; (入栈的是给的s序列的每个下标值,方便最后剔除左括号)
    let stack=[];//模拟栈
    let arr = s.split(''); //转成数组方便操作
    for(let i = 0; i < arr.length; i ++) {
        if(arr[i] == '(') {
            // 遇到( 进栈 
            stack.push(i);
        }else if(arr[i] == ')') {
            // 遇到 )出栈;(前提栈不为空)
            if( stack.length ) {
                // 出栈
                stack.pop()
            }else {
                //剔除原序列多余括号
                arr[i] = ''
            }
        }
    }
    if(stack.length) { // 有多余的左括号,挨个剔除
        for (let i=0; i < stack.length; i ++) {
            arr[stack[i]] = ''
        }
    }
    return arr.join('')


};