开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第29天,点击查看活动详情
1.描述
1021. 删除最外层的括号 - 力扣(LeetCode) (leetcode-cn.com)
有效括号字符串为空 ""
、"(" + 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 <= 10^5
- s[i] 为 '(' 或 ')'
- s 是一个有效括号字符串
2.分析
重点在于如何找出最外层的括号
很重要的思路在于+1,和-1给括号做标识
计数器count 在1和0的时候必定产生括号闭合或者新的左括号,同时0和1不能分辨是否是内部括号
因此我加了额外判断条件
由于splice方法是变异方法,没办法多次调用删除多个下标,每次都会变
因此直接选择“非”思路,把不用删除的元素推到输出的数组里(其实是懒得写非的判断,感觉有点绕)
3.AC代码
var removeOuterParentheses = function(S) {
if(S==''){
return '';
}
let myString = S.split("");
let newString = []
let count = 0;
for(let i = 0;i<S.length;i++){
if(S[i]=='('){
++count;
}else{
--count;
}
if(count==0&&S[i]==')'||count==1&&S[i]=='('){
}else{
newString.push(S[i]);
}
}
return newString.join('');
};