leetCode-1021: 删除最外层的括号

题目描述

有效括号字符串为空 “”、“(” + 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:
输入:s = “(()())(())”
输出:“()()()”
解释:
输入字符串为 “(()())(())”,原语化分解得到 “(()())” + “(())”,
删除每个部分中的最外层括号后得到 “()()” + “()” = “()()()”。

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

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

解题过程

思路及步骤
(1)可以考虑使用栈去存储这些括号,但其实仔细想一下不用去真实的存储数据,只需要记录长度即可;
(2)设置临时变量 count,来记录长度,int 类型的,然后再设置一个临时变量 stringBuilder 去存储最终的结果,StringBuilder 类型的;
(3)遍历原始字符串,若当前字符为 '(',则 count 自增 1,同时如果该次自增之后 count 等于 1,则 continue 掉本次循环,当前字符不需要写入 stringBuilder 中;
(4)若当前字符为 ')',则 count 自减 1,同时如果该次自减之后 count 等于 0,则 continue 掉本次循环,当前字符不需要写入 stringBuilder 中;
(5)最后使用 toString() 方法将 stringBuilder 转换为 String 即可。
代码展示
public class RemoveOuterParentheses {

    public static String removeOuterParentheses(String s) {
        StringBuilder stringBuilder = new StringBuilder();
        int count = 0;
        for (int i = 0; i < s.length(); i++) {
            if (s.charAt(i) == '(') {
                count++;
                if (count == 1) {
                    continue;
                }
            } else {
                count--;
                if (count == 0) {
                    continue;
                }
            }
            stringBuilder.append(s.charAt(i));
        }
        return stringBuilder.toString();
    }

    public static void main(String[] args) {
        String s = "(()())";
        String result = removeOuterParentheses(s);
        System.out.println(result);
    }
}

图解示例

(1)对于字符串 “()” 来说,这一对括号就是外层括号,那么移除之后便是空字符串 “” 了。具体处理流程为:
在这里插入图片描述
i = 0 时,字符为 ‘(’,进行 count++ 操作,自增之后因为此时 count == 1,所以不需要记录 stringBuilder 中;
i = 1 时,字符为 ‘)’,进行 count-- 操作,自减之后因为此时 count == 1,所以不需要记录 stringBuilder 中;

(2)对于字符串 “(())(()())” 来说,最终移除外层括号之后的结果为:“()()()”。具体处理流程为:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值