leecode练习--1021、删除最外层的括号
题目要求:
1、""
,"()"
,"(())()"
和 "(()(()))"
都是有效的括号字符串。
2、如果有效字符串 S
非空,且不存在将其拆分为 S = A+B
的方法,我们称其为原语(primitive),其中 A
和 B
都是非空有效括号字符串。
3、对 S
进行原语化分解,删除分解中每个原语字符串的最外层括号,返回 S
4、例子:
输入:"(()())(())(()(()))"
输出:"()()()()(())"
解释:
输入字符串为 "(()())(())(()(()))",原语化分解得到 "(()())" + "(())" + "(()(()))",
删除每隔部分中的最外层括号后得到 "()()" + "()" + "()(())" = "()()()()(())"。
解题思路:
注意:题目中所输入的字符串默认只有()括号字符,不要死钻牛角尖,认为字符串中还有其他字符
题目要求是将最外层括号删除,我们需要遍历每个字符,将最外层的括号通过索引和计数来一一删除
我们可以通过定义一个变量 R 来锁定最外层右括号的位置,当遍历到左括号时,它就加一,遍历到右括号时则减一,当它为为0时,就删除这个位置上的字符
当只有上述变量时,我们只能删除最外层右括号,所以我们需要定义另一个变量 L 来锁定最外层左括号的位置。当遍历到左括号时,L加一,遍历到右括号时则不发生任何变动,当L为1时,删除当前位置上的字符,当R为0时,L也归零
我们将每一次遍历后留下来的字符加到一个新定义的字符串变量中,最后将它就是我们需要的答案
代码实现:
class Solution:
def removeOuterParentheses(self, S: str) -> str:
R = 0
L = 0
nS = ''
for c in S:
if c == '(': #遍历到左括号时
R += 1
L += 1
else:
R -=1
if R > 0 and L > 1: #逆向思维:只要R不是0且L不为1就留下字符
nS += c
if R == 0: #如果R为0,说明新的外层左括号要到了
L = 0 #为删除最外层左括号,L必须归零
return nS