掘金团队号上线,助你 Offer 临门! 点击 查看详情
题目描述
有效括号字符串为空 ("")、"(" + 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:
输入:"(()())(())"
输出:"()()()"
解释:
输入字符串为 "(()())(())",原语化分解得到 "(()())" + "(())",
删除每个部分中的最外层括号后得到 "()()" + "()" = "()()()"。
解题思路
思路:
- 首先解决这道题的关键在于需要知道哪些是需要去除的外层括号;
- 为了找到这些需要去除的外层括号,需要用到计数器;
- 遇到左括号,我们的计数器+1,遇到右括号,我们的计数器−1,这样,一对有效保留的括号,总共让计数器归零,若不归零,则代表当前遍历到的括号中,一定存在多余括号;
- 最后的规律就是:遇到左括号,当前计数值大于 0,则属于有效的左括号;遇到右括号,当前计数值大于 1,则属于有效的右括号。
解题代码
var removeOuterParentheses = function (S) {
let res = '';
let opened = 0;
for (ch of S) {
// opend >0说明已经有了一个左括号
//新找到的这个左括号,就认为他不是最外层的括号,就给他拼接起来,然后这个数量进行加一;
if (ch === '(' && opened++ > 0) res += ch;
// opend >1说明已经有了两个及以上左括号
//新找到的这个右括号,就认为他不是最外层的括号,就给他拼接起来,然后这个左括号的数量进行减一;
if (ch === ')' && opened-- > 1) res += ch;
}
return res;
};
总结
千里之行,始于足下。