首页 > 其他分享 >栈:删除最外层括号

栈:删除最外层括号

时间:2023-04-29 09:45:00浏览次数:36  
标签:外层 ch 删除 start 括号 原语 字符串

题目

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

解决方案

//通过使用栈标记原语的位置,然后使用java中的substring()方法截取最外括号的里面一串字符作为结果
public static String removeOuterParentheses(String s) {
        StringBuilder ans = new StringBuilder();
        Stack<Character> stack = new Stack<>();

        int start = 0;//初始化原语的起始位置
        int end = 0; //初始化原语的结束位置
        boolean flag = false; //标志每个原语

        for(int i = 0;i < s.length();i++){
            char ch = s.charAt(i);

            if(ch == '('){//遇到左括号,入栈
                stack.push(ch);
                if(!flag){//遇到的第一个左括号,是原语的开始位置,记录下原语开始位置
                    start = i;
                    flag = true;

                }
            }
            if(ch == ')'){//遇到右括号,出栈
                stack.pop();
                if(stack.isEmpty()){//当栈空的时候,找到了一个完整的原语
                    end = i;//记录下结束位置
                    ans.append(s.substring(start + 1,end));
                    flag = false;
                    start = end + 1;
                }
            }
        }
        return ans.toString();
    }

标签:外层,ch,删除,start,括号,原语,字符串
From: https://www.cnblogs.com/xdtxblog/p/17363591.html

相关文章

  • Problem J: 括号匹配问题
    ProblemDescription在某个字符串(长度不超过100)中有左括号、右括号和大小写字母;规定(与常见的算数式子一样)任何一个左括号都从内到外与在它右边且距离最近的右括号匹配。写一个程序,找到无法匹配的左括号和右括号,输出原来字符串,并在下一行标出不能匹配的括号。不能匹配的左括号用......
  • 【python基础】创建和删除目录
    前言importosimportshutilpath='/home/tfl19671/out'ifnotos.path.exists(path):os.mkdir(path)else:shutil.rmtree(path,True)os.mkdir(path)其中shutil.rmtree(filepath,ignore_errors=True)删除整个filepath路径的内容。如果ignore_errors=True,则表......
  • Python3从头/尾删除子符串的正确操作
    一、说明从某个时候发现python的字符串变量自带的strip()方法,除了可以删除字符串头尾的空格,还可以用来删除头尾的字符串觉得很好用。也就一直这么用,一直也没发现什么问题。今天在修复一个bug时使用了strip()方法但从结果看bug并没有按预期被消除,一是没怀疑strip()删除子字符串有......
  • 6669: 括号配对 区间dp
    描述 Hecy又接了个新任务:BE处理。BE中有一类被称为GBE。以下是GBE的定义:空表达式是GBE如果表达式A是GBE,则[A]与(A)都是GBE如果A与B都是GBE,那么AB是GBE。 输入 输入仅一行,为字符串BE。对于100%的数据,输入的字符串长度小于100。 输......
  • 新项目删除SceneDelegate以及创建PrefixHeader文件
    1.新项目删除SceneDelegate删除SceneDelegate文件info.plist文件中删除ApplicationSceneManifest中的item删除SceneDelegate在AppDelegate中的代理在AppDelegate.h添加window小问题:2.新项目plist文件的移动buildSeting里搜索info.plistFile设置路径3.......
  • 删除 vs code 中的 github 登录信息
    在Windows系统下,VSCode使用Git存储和管理GitHub登录凭据。默认情况下,Git会使用WindowsCredentialManager存储凭据。要删除存储在其中的GitHub登录信息,请遵循以下步骤:打开“控制面板”(ControlPanel)。点击“用户账户”(UserAccounts)。点击“凭据管理器”(Credenti......
  • vim 替换操作和特定行删除
    字符串替换1.先按Esc进入命令模式,然后再打出‘:’(英文输入模式下)2.输入格式: 首行数,末行数s/要替换的字符串/替换的字符串/g  ;    常用操作为     :start_line,end_line s/xxx/xxx/(不加g只替换每行的第一个要替换的字符串,后面的不会替换, s代表字符串的意思......
  • Linux文件和目录删除
    今天只讲一个命令,这个命令已经让万千运维人既爱又恨。rm删除文件或者目录基本用法:-i显示删除提示信息-f 强制删除文件-r进行目录的递归删除在公司里为了保证数据安全,一般会创建一个alias;aliasrm='rm-i'也有时候我们会写一个脚本来防止误删除,不过作为运维人员,备份很重要,......
  • mdadm彻底删除software RAID 0
    有没有朋友感觉今天的文章有点难,如果觉得难的朋友可以在下面留言,后面我会给大家安排一些简单的文章,让大家可以循序渐进。基础稍微薄弱的童鞋也可以投稿,这样你就慢慢成长起来了。在我们社区,我希望你们都可以成为大牛,很大很大的大牛哈。加油!Linux系统中可以通过使用mdadm这个简单高效......
  • 15.mybatis-plus的QueryWrapper的查询、更新、删除的用法
    1.条件构造查询: 2.主装的查询语句:  3.主装排序的查询语句:   4.删除语句:  5.更新语句的应用:userMapper.update(A,B);QueryWrapperuserWrapper=newQueryWrapper <>();Useruser=newUser();应用:update(user,userWrapper)user:封装的是修改的内容;userWr......