zoukankan      html  css  js  c++  java
  • LeetCode.1021-删除最外面的括号(Remove Outermost Parentheses)

    这是小川的第380次更新,第408篇原创

    01 看题和准备

    今天介绍的是LeetCode算法题中Easy级别的第242题(顺位题号是1021)。有效的括号字符串为空("")"("+ A +")"A + B,其中A和B是有效的括号字符串,+表示字符串连接。例如,"""()""(())()""(()(()))"都是有效的括号字符串。

    如果有效的括号字符串S是非空的,并且不存在将其拆分为S = A + B的方法,其中A和B是非空有效括号字符串,则它是原始的。

    给定有效的括号字符串S,考虑其原始分解:S = P_1 + P_2 + ... + P_k,其中P_i是原始有效括号字符串。

    在去除S的原语分解中的每个原始字符串的最外面的括号后返回S。例如:

    输入:"(()())(())"
    输出:"()()()"
    说明:
    输入字符串是"(()())(())",带有原语分解"(()())"+"(())"
    删除每个部分的外括号后,"()()" + "()" = "()()()"

    输入:"(()())(())(()(()))"
    输出:"()()()()(())"
    说明:
    输入字符串是"(()())(())(()(()))",带原语分解"(()())"+"(())"+"(()(( )))"
    删除每个部分的外括号后,"()()" + "()" + "()(())" = "()()()()(())"

    输入:"()()"
    输出:""
    说明:
    输入字符串是"()()",原始分解"()"+"()"
    删除每个部分的外括号后,""+""=""。

    注意

    • S.length <= 10000

    • S[i]"("")"

    • S是一个有效的括号字符串。

    02 第一种解法

    根据题目的描述和例子来看,是要找到S中的每一个原始有效字符串,然后去掉每个原始有效字符串的外层括号。

    S中,左括号"("和右括号")"是成对出现的,即在每一个原始有效字符串中,左括号和右括号的数量是相同的。

    思路:从左到右遍历S中的字符,定义两个变量leftright,记录遇到的左括号、右括号的数量,当左括号和右括号的数量相等时,说明遇到了一个原始有效字符串,去掉头尾的括号,借助字符串截取完成,拼接到StringBuilder中。

    public String removeOuterParentheses(String S) {
        StringBuilder sb = new StringBuilder();
        int left = 0, right = 0, index = 0;
        int n = S.length();
        for (int i=0; i<n; i++) {
            if (S.charAt(i) == '(') {
                left++;
            } else if (S.charAt(i) == ')') {
                right++;
            }
            if (left == right) {
                sb.append(S.substring(index+1, i));
                index = i + 1;
            }
        }
        return sb.toString();
    }
    

    03 第二种解法

    思路和上面第一种解法类似,只是没有借助两个变量来计数,而是使用一个变量count,遇到左括号就加1,遇到右括号就减1,但是最开始的左括号和最后边的右括号时不能拼接进去的,所以当遇到左括号且count等于1的时候,要进入下一次循环,当遇到右括号且count等于0的时候,表明当前这个原始有效字符串中的括号已经遍历完了,需要进入下一次循环。

    public String removeOuterParentheses2(String S) {
        StringBuilder sb = new StringBuilder();
        int count = 0, n = S.length();
        for (int i=0; i<n; i++) {
            if (S.charAt(i) == '(') {
                count++;
                if (count == 1) {
                    continue;
                }
            } else if(S.charAt(i) == ')') {
                count--;
                if (count == 0) {
                    continue;
                }
            }
            sb.append(S.charAt(i));
        }
        return sb.toString();
    }
    

    04 小结

    算法专题目前已连续日更超过七个月,算法题文章248+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

    以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

  • 相关阅读:
    基本数据结构——栈
    错误 1 error C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. d:usersvs2013le
    Java内存区域
    VS2010 无法计算HKEY_LOCAL_MACHINESOFTWAREMicrosoftMSBuildToolsVersions14.0@VCTargetPath处的属性表达式
    PHP高并发场景下的一点思路
    LINUX运维常用命令
    php7的一些新特性总结
    MySQL读写分离主从配置
    php 生成唯一id的几种解决方法
    浅谈mysql两种常用引擎MyIASM和InnoDB的区别
  • 原文地址:https://www.cnblogs.com/xiaochuan94/p/11173956.html
Copyright © 2011-2022 走看看