1021.删除最外层的括号
【LetMeFly】1021.删除最外层的括号
力扣题目链接:https://leetcode.cn/problems/remove-outermost-parentheses/
有效括号字符串为空 ""
、"(" + A + ")"
或 A + B
,其中 A
和 B
都是有效的括号字符串,+
代表字符串的连接。
例如,""
,"()"
,"(())()"
和 "(()(()))"
都是有效的括号字符串。
如果有效字符串 s
非空,且不存在将其拆分为 s = A + B
的方法,我们称其为原语(primitive),其中 A
和 B
都是非空有效括号字符串。
给出一个非空有效字符串 s
,考虑将其进行原语化分解,使得:s = P_1 + P_2 + ... + P_k
,其中 P_i
是有效括号字符串原语。
对 s
进行原语化分解,删除分解中每个原语字符串的最外层括号,返回 s
。
示例 1:
1 |
|
示例 2:
1 |
|
示例 3:
1 |
|
提示:
- $1\leq s.length\leq 10^5$
s[i]
为‘(’
或‘)’
- $s$ 是一个有效阔和字符串
题目大意
题目大概意思就是要把原字符串拆分成(...)(...)(...)
的样子。
例如某个字符串可以拆分成(a)(b)(c)(d)
,那么就返回abcd
。
其中,我们把(a)
、(b)
、(c)
、(d)
记为原语。
也就是说要把由原语组成的字符串拆分成每个原语,然后把每个原语去掉两边的括号并按顺序拼接后返回。
思路
用变量$left$来记录未配对的左括号的数量。
从左到右遍历字符串,遇到左括号$left$就$+1$,遇到右括号就$-1$。
也就是用计数来模拟栈。
方法一:模拟
遇到左括号,如果计数之前$left$为$0$,那么就说明这是一个原语
的*_开始。原语的最左_*括号是不用作为答案返回的,因此只有当$left$不为$0$的时候才返回当前字符。
遇到右括号,如果计数之后$left$为$0$,那么就说明这是一个原语
的结束。原语的最右括号是不用作为答案返回的,因此只有当$left$不为$0$的时候才返回当前字符。
- 时间复杂度$O(n)$
- 空间复杂度$O(1)$
AC代码
C++
1 |
|
同步发文于CSDN,原创不易,转载请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/125015777