Leetcode 921:使括号有效的最少添加(最详细的解法!!!)

给定一个由 '('')' 括号组成的字符串 S,我们需要添加最少的括号( '(' 或是 ')',可以在任何位置),以使得到的括号字符串有效。

从形式上讲,只有满足下面几点之一,括号字符串才是有效的:

  • 它是一个空字符串,或者
  • 它可以被写成 ABAB 连接), 其中 AB 都是有效字符串,或者
  • 它可以被写作 (A),其中 A 是有效字符串。

给定一个括号字符串,返回为使结果字符串有效而必须添加的最少括号数。

示例 1:

输入:"())"
输出:1

示例 2:

输入:"((("
输出:3

示例 3:

输入:"()"
输出:0

示例 4:

输入:"()))(("
输出:4

提示:

  1. S.length <= 1000
  2. S 只包含 '('')' 字符。

解题思路

这个问题非常简单,我们通过stack就可以解决。我们首先建立一个栈stack,然后将S中的元素压入到stack中。每次压入元素后,判断stack顶部元素是不是)S的顶部元素是不是(,如果是的话,将两者的栈顶元素都弹出。重复上面的操作,知道S为空,最后返回stack的长度即可。

class Solution:
    def minAddToMakeValid(self, S):
        """
        :type S: str
        :rtype: int
        """
        s_list = list(S)
        stack = list()
        while s_list:
            tmp = s_list.pop()
            stack.append(tmp)
            while stack and s_list and stack[-1]==')' and s_list[-1] == '(':
                stack.pop()
                s_list.pop()

        return len(stack)

对于这个问题,我们不开辟额外的存储空间也可以解决。我们定义一个变量left记录未配对的(数量,然后我们只要遍历S,判断遍历到的元素是不是(,如果是的话,我们left++,否则的话说明配对成功,我们left--。例如

( ) )
|

left = 1

接着遍历下一个元素

( ) )
  |

left = 0

接着遍历下一个元素

( ) )
    |

left = -1

我们发现这个时候tmp==-1,说明有一个)没有配对,我们将tmp=0,同时记录这个没有配对的元素right++。我们最后返回的结果就是left+right

class Solution:
    def minAddToMakeValid(self, S):
        """
        :type S: str
        :rtype: int
        """
        right, left, = 0, 0
        for s in S:
            left += 1 if s == '(' else -1
            if left == -1:
                right += 1
                left += 1

        return right + left

我将该问题的其他语言版本添加到了我的GitHub Leetcode

如有问题,希望大家指出!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值