LeetCode~1021. 删除最外层的括号

117 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第18天,点击查看活动详情

题目描述

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

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

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

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

示例

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

提示

  • 1 <= s.length <= 105^5
  • s[i] 为 '(' 或 ')'
  • s 是一个有效括号字符串

在原字符串中,我们需要去除掉最外层的括号,那么可以采用来实现,利用其后入先出的特性,将左边括号压入栈中,遇到右边括号时,弹出栈中左边的括号,如果栈不为空,则将当前括号对加入结果中,最后返回结果。

class Solution {
    public String removeOuterParentheses(String s) {
        StringBuffer res = new StringBuffer();
        Stack<Character> stack = new Stack<>();
        char[] chStr = s.toCharArray();
        
        // 遍历所有字符
        for(char c : chStr){
            // 右边括号,将栈中的左边括号弹出
            if (c == ')') {
                stack.pop();
            }
            // 不为最外层的括号,拼接进结果中
            if (!stack.isEmpty()) {
                res.append(c);
            }
            
            // 左边括号都入栈
            if (c == '(') {
                stack.push(c);
            }
        }
        
        // 返回结果
        return res.toString();
    }
}