[路飞]_程序员必刷力扣题: 1021. 删除最外层的括号

1021. 删除最外层的括号

有效括号字符串为空 ""、"(" + 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:

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

示例 2:

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

示例 3:

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

提示:

  • 1 <= s.length <= 105
  • s[i] 为 '(' 或 ')'
  • s 是一个有效括号字符串

遍历+括号打开状态记录字符串

思路

这道题目我们首先知道都是有效字符括号字符串,那么必然存在括号打开和关闭的状态

我们用score来表示括号来表示状态,

  • 当遇到(证明括号打开,score+=1,否则遇到)证明括号关闭,score-=1,这样当score>0则代表括号打开,否则代表括号关闭
  • 我们需要在括号打开后,记录遇到的字符串,需要在括号关闭的时候直接跳过

注意: 括号打开和关闭时的两个字符串不需要记录,怎么处理呢?

  • 我们在遇到(括号的时候判断score是不是大于1的如果是则代表是括号打开状态后内部的括号,如果===1那么证明该次是括号打开状态,无需记录
  • 遇到)括号的时候判断score是不是0,是的话证明括号关闭,此次无需记录
var removeOuterParentheses = function (s) {
    var score = 0
    var newStr = ''
    var i = 0
    while (i < s.length) {
        var item = s[i]
        i++
        if(item==='('){
            score+=1
            if(score>1){
               newStr+=item 
            }
        }else{
            score-=1
            if(score===0){
               continue
            }
            newStr+=item 
        }
    }
    return newStr
};
复制代码

猜你喜欢

转载自juejin.im/post/7037132327280967693