[LeetCode-1021删除最外层的括号] | 刷题打卡

144 阅读2分钟

掘金团队号上线,助你 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. 首先解决这道题的关键在于需要知道哪些是需要去除的外层括号;
  2. 为了找到这些需要去除的外层括号,需要用到计数器;
  3. 遇到左括号,我们的计数器+1,遇到右括号,我们的计数器−1,这样,一对有效保留的括号,总共让计数器归零,若不归零,则代表当前遍历到的括号中,一定存在多余括号;
  4. 最后的规律就是:遇到左括号,当前计数值大于 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;
};

总结

千里之行,始于足下。