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
};
复制代码