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 <= s.length <= 105
  • s[i] 为 '(' 或 ')'
  • s 是一个有效括号字符串

 Related Topics

  • 字符串

重点!!!解题思路

 A方法--:直接遍历字符串和计数器的结合来解题

 B方法--:如题目中一样拆分成原语后再删除括号

A方法源码+讲解:

class Solution {
    public String removeOuterParentheses(String s) {
        String str="";  //拼接字符串
        int opened=0;  //计数器
        for(char c:s.toCharArray()){  //遍历s字符串
            if (c=='(' && opened++>0){  //当获取到左括号,我们看看是不是第二个左括号,如果是那么我们就拼到字符串中,如果不是opened就+1
                str+=c;
            }
            if (c==')' && opened-->1){  //当获取到右括号,我们判断计数器是不是大于1,如果大于1相当于前面有大于1个左括号,这是这个右括号肯定不用删除,我们正常拼接
                str+=c;
            }
        }
        return str;
    }
}

B方法源码+讲解: 

class Solution {
        public String removeOuterParentheses(String s) {
            String last="";  //拼接字符串
            int cnt=0;  //计数器
            int beginIndex=0;  //字符串截取的头下标
            int lastIndex=0;  //字符串截取的尾下标
            for (int i=0;i<s.length();i++){  //遍历字符串
                if (s.charAt(i)=='('){  //当遍历到左括号时判断一下计数器是不是0,如果是0就意味着这个是原语的开始,那就记录一下
                    if (cnt==0){
                        beginIndex=i;
                    }
                    cnt++;  //有一个左括号就+1
                }else {
                    cnt--;  //有一个右括号就-1
                    if (cnt==0){  //当计数器再次=0时,说明前面的括号和右面的括号相等,那么此时这个位置就是原语的结尾,记录一下
                        lastIndex=i;
                        last+=s.substring(beginIndex+1,lastIndex);  //截取字符串,左闭右开原则,截取内部括号,然后拼接到一起
                    }
                }
            }
            return last;
        }
    }

如果您还有什么疑问或解答有问题,可在下方评论,我会及时回复。 

系列持续更新中,点个订阅吧

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

月亮被咬碎成星星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值