1021 删除最外层的括号-简单

题目:

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

  • 例如,"""()""(())()""(()(()))" 都是有效的括号字符串。

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

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

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

示例 1:

输入:s = "(()())(())"
输出:"()()()"
解释:
输入字符串为 "(()())(())",原语化分解得到 "(()())" + "(())",
删除每个部分中的最外层括号后得到 "()()" + "()" = "()()()"。

示例 2:

输入:s = "(()())(())(()(()))"
输出:"()()()()(())"
解释:
输入字符串为 "(()())(())(()(()))",原语化分解得到 "(()())" + "(())" + "(()(()))",
删除每个部分中的最外层括号后得到 "()()" + "()" + "()(())" = "()()()()(())"。

示例 3:

输入:s = "()()"
输出:""
解释:
输入字符串为 "()()",原语化分解得到 "()" + "()",
删除每个部分中的最外层括号后得到 "" + "" = ""。

分析:

利用栈的思维进行模拟,正序遍历,遇到 ( 计数增加1,遇到 )计数减少1,同时保存在临时结果中。

当计数 cnt 为零时,表示找到一个原语,去掉最外层的括号,存入结果。

// date 2023/12/18
func removeOuterParentheses(s string) string {
    // 统计一个原语
    cnt := 0
    stack := ""
    res := ""
    for i := 0; i < len(s); i++ {
        char := s[i]
        if char == '(' {
            cnt++
        } else if char == ')' {
            cnt--
        }
        stack += string(char)
        if cnt == 0 {
            res += stack[1:len(stack)-1]
            stack = ""
        }
    }

    return res
}

最后更新于