921. 使括号有效的最少添加(Python)

难度:★★★☆☆
类型:字符串
方法:栈

题目

力扣链接请移步本题传送门
更多力扣中等题的解决方案请移步力扣中等题目录

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

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

它是一个空字符串,或者
它可以被写成 AB (A 与 B 连接), 其中 A 和 B 都是有效字符串,或者
它可以被写作 (A),其中 A 是有效字符串。
给定一个括号字符串,返回为使结果字符串有效而必须添加的最少括号数。

示例 1:

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

示例 2:

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

示例 3:

输入:"()"
输出:0

示例 4:

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

提示:

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

解答

我们用栈来解决括号匹配的问题。

准备一个只用来存左括号的栈,从左往右遍历字符串,如果遇到右括号,就要做以下判断:
栈为空,说明在这个右括号左边没有可以与之配对的左括号,匹配失败,计数器加一。
栈不为空,则弹出栈中的一个左括号。

如果遇到左括号,则将该括号入栈。

当所有字符遍历完成后,如果栈中还有左括号,说明,这些左括号没有可以配对的右括号,需要补充相应个数的右括号。

最后返回的就是补充左括号的个数加补充右括号的个数。

class Solution:
    def minAddToMakeValid(self, S: str) -> int:
        stack = []
        n = 0
        for c in S:
            if c == ")":
                if stack:
                    stack.pop()
                else:
                    n += 1
            elif c == "(":
                stack.append(c)
        return n + len(stack)

如有疑问或建议,欢迎评论区留言~

有关更多力扣中等题的python解决方案,请移步力扣中等题解析

你可能感兴趣的:(921. 使括号有效的最少添加(Python))