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 。

 

 

 

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/remove-outermost-parentheses

刚开始看这道题的时候没看明白题目的意思是什么,一会是有效括号字符串,一会是拆分为原语(这是什么意思)。

看了几分钟,然后结合下面给的示例(例子只能做参考帮助理解题意,但是千万不要按照例子去写代码,这样写出得代码会与例子过于耦合,而有的题目给的例子特别容易误导人,导致写出的代码能通过例子但是一提交就各种不通过,然后继续按照没通过的答案去改代码,导致改来改去好多次,最后还是没通过)。

我分析出以下几点:

1.题目给的字符串s一定是个有效的括号字符串(给出一个非空有效字符串 s)

2.需要我们进行拆分为多个有效的括号字符串(使得:s = P_1 + P_2 + ... + P_k,其中 P_i 是有效括号字符串原语)

3.然后需要删除拆分出来的每个有效字符串的最外侧括号(删除分解中每个原语字符串的最外层括号)

也就是说需我们做两件事,拆分、删除。需要注意的是当只有一对括号时(如:())删除最外侧的操作返回的就是空

然后需要考虑的是如何拆分,才能保证所得的字符串是有效的括号?

1.一般处理有效的括号的方法我想的是用栈,但是我只需要知道我的字符串是否是有效的括号就行,于是我可以用一个计数器来完成这个工作(因为题目给的字符串均是有效的,如果字符串中存在无效的括号就不能用这个方法例如:))((   ),当匹配到左括号的时候,计数器减一,当匹配到右括号时计数器加一,最后判断计数器为0且字符串不为空的时候就找到了我们拆分后的字符串

2.找到拆分的字符串后将它加入到数组中,然后置为空继续循环拆分,到这里拆分的工作就完成了

3.从数组中取出来拆分的字符串,然后进行第2步操作——删除。这里我用截取字符串的方法完成,需要注意的是只有一对括号的时候(例如:())是不需要拆分的

综上,我写出以下代码:

复制代码
class Solution:
    def removeOuterParentheses(self, s: str) -> str:
        ret = []
        tmp = ''
        t = 0
        for i in s:
            if i == '(':
                t -= 1
            if i == ')':
                t += 1
            tmp += i
            if t == 0 and tmp != '':
                ret.append(tmp)
                tmp = '' 
        ans = ''
        for j in ret:
            if len(j) <= 1:
                ans += j
            else:
                ans += j[1 : -1]
        return ans
复制代码

提交查看通过。

posted @   *小白*  阅读(25)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示