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
提交查看通过。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理