相声队算法题册Day3-删除最外层的括号

203 阅读1分钟

原题地址

题目描述

有效括号字符串为空("")、"(" + A + ")"或A + B,其中A 和B都是有效的括号字符串,+代表字符串的连接。例如,"","()","(())()"和"(()(()))"都是有效的括号字符串。

如果有效字符串S非空,且不存在将其拆分为S = A+B的方法,我们称其为原语(primitive),其中A 和B都是非空有效括号字符串。

给出一个非空有效字符串S,考虑将其进行原语化分解,使得:S = P_1 + P_2 + ... + P_k,其中P_i是有效括号字符串原语。

对S进行原语化分解,删除分解中每个原语字符串的最外层括号,返回 S。

示例 1:

输入:"(()())(())"

输出:"()()()"

解释: 输入字符串为 "(()())(())",原语化分解得到 "(()())" + "(())", 删除每个部分中的最外层括号后得到 "()()" + "()" = "()()()"。

示例 2:

输入:"(()())(())(()(()))"

输出:"()()()()(())"

解释: 输入字符串为 "(()())(())(()(()))",原语化分解得到 "(()())" + "(())" + "(()(()))", 删除每隔部分中的最外层括号后得到 "()()" + "()" + "()(())" = "()()()()(())"。

示例 3:

输入:"()()"

输出:""

解释: 输入字符串为 "()()",原语化分解得到 "()" + "()", 删除每个部分中的最外层括号后得到 "" + "" = ""。

提示:

S.length <= 10000

S[i] 为"(" 或")"

S 是一个有效括号字符串

解题方法

/**
 * lv大佬
 */
var removeOuterParentheses = function(S) {
    
    var m = 0;
    var n = 0;
    var list = [];
    var result = [];
    for(var i = 0; i< S.length; i++){      
        if(S[i] === '('){
            m ++;
        }else{
            n ++;
        }
       list.push(S[i]);
        if(m === n){
            list.pop();
            list.shift();
            result.push(list.join(""));
            list = [];
           
        }
    }
    return result.join("");

};
/**
 * Ding大佬
 */
var removeOuterParentheses = function(S) {
    
    var m = 0;
    var n = 0;
    var list = [];
    var result = [];
    for(var i = 0; i< S.length; i++){  
        list.push(S[i]);
        if(S[i] === '('){
            m ++;
        }else{
            n ++;
        }
        if(m === n){
            result.push(list.slice(1,list.length-1).join(""));
            list = [];
        }
    }
    return result.join("");

};

反思

先研究明白题,再写。。😢