题目描述
思路解析动画文字版
记住这句口诀:左括号深度大于 0 才输出再加一,右括号先减一还大于 0 才输出。后面每一帧都在套它。
开局:深度计数器 depth = 0,结果串为空。上面一排是要扫的括号串,下面这根栈每压入一个左括号就长高一层,栈高就是当前深度。指针从第 0 个字符开始往右走。
指针移到第 0 个字符,是一个左括号。先看现在的深度是 0,也就是栈里还没闭合的左括号有 0 个,再决定这个字符输不输出。
这个左括号进栈前深度是 0,它正是一个原语最外层那一层,按规矩跳过不输出,只让深度加一变成 1。
指针移到第 1 个字符,是一个左括号。先看现在的深度是 1,也就是栈里还没闭合的左括号有 1 个,再决定这个字符输不输出。
这个左括号进栈前深度是 1,已经大于 0,说明外面还套着括号,它是内层的,要输出。先把 ( 写进结果,再让深度加一变成 2。
指针移到第 2 个字符,是一个右括号。先看现在的深度是 2,也就是栈里还没闭合的左括号有 2 个,再决定这个字符输不输出。
右括号先让深度减一,现在是 1,还大于 0,说明它封的不是最外层,要输出。把 ) 写进结果。
指针移到第 3 个字符,是一个左括号。先看现在的深度是 1,也就是栈里还没闭合的左括号有 1 个,再决定这个字符输不输出。
这个左括号进栈前深度是 1,已经大于 0,说明外面还套着括号,它是内层的,要输出。先把 ( 写进结果,再让深度加一变成 2。
指针移到第 4 个字符,是一个右括号。先看现在的深度是 2,也就是栈里还没闭合的左括号有 2 个,再决定这个字符输不输出。
右括号先让深度减一,现在是 1,还大于 0,说明它封的不是最外层,要输出。把 ) 写进结果。
指针移到第 5 个字符,是一个右括号。先看现在的深度是 1,也就是栈里还没闭合的左括号有 1 个,再决定这个字符输不输出。
右括号让深度减一变成 0,正好闭合了一整个原语,它是最外层的右括号,跳过不输出,结果里又攒齐了一段。
指针移到第 6 个字符,是一个左括号。先看现在的深度是 0,也就是栈里还没闭合的左括号有 0 个,再决定这个字符输不输出。
这个左括号进栈前深度是 0,它正是一个原语最外层那一层,按规矩跳过不输出,只让深度加一变成 1。
指针移到第 7 个字符,是一个左括号。先看现在的深度是 1,也就是栈里还没闭合的左括号有 1 个,再决定这个字符输不输出。
这个左括号进栈前深度是 1,已经大于 0,说明外面还套着括号,它是内层的,要输出。先把 ( 写进结果,再让深度加一变成 2。
指针移到第 8 个字符,是一个右括号。先看现在的深度是 2,也就是栈里还没闭合的左括号有 2 个,再决定这个字符输不输出。
右括号先让深度减一,现在是 1,还大于 0,说明它封的不是最外层,要输出。把 ) 写进结果。
指针移到第 9 个字符,是一个右括号。先看现在的深度是 1,也就是栈里还没闭合的左括号有 1 个,再决定这个字符输不输出。
右括号让深度减一变成 0,正好闭合了一整个原语,它是最外层的右括号,跳过不输出,结果里又攒齐了一段。
整串扫完,栈又空了、深度从 0 出发也回到 0,说明括号配对完整。最外层的每一对括号都被跳过,留下的就是去掉外层后的结果 ()()()。
边界先想清:单层、并列两段、嵌套一层,分别会得到空串或保留内层。
面试重点:认出「深度计数找段边界」这个母题。
参考代码
from __future__ import annotationsfrom typing import *from collections import *from functools import *from itertools import *from math import *from heapq import *from bisect import *class Solution: def removeOuterParentheses(self, s: str) -> str: ans = [] cnt = 0 for c in s: if c == '(': cnt += 1 if cnt > 1: ans.append(c) else: cnt -= 1 if cnt > 0: ans.append(c) return ''.join(ans)复杂度
- 时间:O(n),每个字符只看一次,一遍扫完
- 空间:O(1),只用一个深度计数器;返回的结果串不计入额外空间
易错点
面试追问把动画讲成自己的话
追问这题和判断括号是否有效(lc20)有什么联系?
追问如果让你顺便返回原语的个数,怎么改?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
删除字符串中的所有相邻重复项
LeetCode 1047 · 简单 · 沿着 栈套路 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题