leecode练习--1021、删除最外层的括号

leecode练习--1021、删除最外层的括号

题目要求:

1、"""()""(())()""(()(()))" 都是有效的括号字符串。

2、如果有效字符串 S 非空,且不存在将其拆分为 S = A+B 的方法,我们称其为原语(primitive),其中 AB 都是非空有效括号字符串。

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
                
原文地址:https://www.cnblogs.com/itboy-newking/p/10882184.html