[路飞]_leetcode_1021.删除最外层的括号

85 阅读1分钟

有效括号字符串为空 ""、"(" + A + ")" 或 A + B ,其中 A 和 B 都是有效的括号字符串,+ 代表字符串的连接。

例如,"","()","(())()" 和 "(()(()))" 都是有效的括号字符串。 如果有效字符串 s 非空,且不存在将其拆分为 s = A + B 的方法,我们称其为原语(primitive),其中 A 和 B 都是非空有效括号字符串。

给出一个非空有效字符串 s,考虑将其进行原语化分解,使得:s = P_1 + P_2 + ... + P_k,其中 P_i 是有效括号字符串原语。

对 s 进行原语化分解,删除分解中每个原语字符串的最外层括号,返回 s 。

解题思路

这一题主要是删除有效括号的最外一层括号。 例如: (()) 删除最外一层括号为 () 那么删除最外一层括号的方法是找一个值 cnt 记录相同字符的次数:

  1. 当遇到(时,cnt++, cnt > 0时,我们保存这个字符
  2. 当遇到)时,cnt--. cnt > 1时,我们保存这个字符
字符串 ( ( ) )     当前:'('  cnt == 0  cnt++
指针   ^

字符串 ( ( ) )     当前:'('  cnt == 1  cnt++  ret = (
指针     ^

字符串 ( ( ) )     当前:')'  cnt == 2  cnt--  ret = ()
指针       ^

字符串 ( ( ) )     当前:')'  cnt == 1  cnt--  ret = ()
指针         ^

代码

var removeOuterParentheses = function(s) {
    let ret = "", cnt = 0;
    for(k of s) {
        if (k === '(' && cnt++ > 0) ret += k
        if (k === ')' && cnt-- > 1) ret += k
    }
    return ret;
};