0921. 使括号有效的最少添加
大约 2 分钟
---
0921. 使括号有效的最少添加
- 标签:栈、贪心、字符串
- 难度:中等
题目链接
题目大意
描述:给定一个括号字符串 s,可以在字符串的任何位置插入一个括号。
要求:返回为使结果字符串 s 有效而必须添加的最少括号数。
说明:
- 。
s只包含'('和')'字符。
只有满足下面几点之一,括号字符串才是有效的:
- 它是一个空字符串,或者
- 它可以被写成 AB (A 与 B 连接), 其中 A 和 B 都是有效字符串,或者
- 它可以被写作 (A),其中 A 是有效字符串。
例如,如果 s = "()))",你可以插入一个开始括号为 "(()))" 或结束括号为 "())))"。
示例:
- 示例 1:
输入:s = "())"
输出:1解题思路
思路 1:贪心算法
为了最终添加的最少括号数,我们应该尽可能将当前能够匹配的括号先进行配对。则剩余的未完成配对的括号数量就是答案。
我们使用变量 left_cnt 来记录当前左括号的数量。使用 res 来记录添加的最少括号数量。
- 遍历字符串,判断当前字符。
- 如果当前字符为左括号
(,则令left_cnt加1。 - 如果当前字符为右括号
),则令left_cnt减1。如果left_cnt减到-1,说明当前有右括号不能完成匹配,则答案数量res加1,并令left_cnt重新赋值为0。 - 遍历完之后,令
res加上剩余不匹配的left_cnt数量。 - 最后输出
res。
思路 1:贪心算法代码
class Solution:
def minAddToMakeValid(self, s: str) -> int:
res = 0
left_cnt = 0
for ch in s:
if ch == '(':
left_cnt += 1
elif ch == ')':
left_cnt -= 1
if left_cnt == -1:
left_cnt = 0
res += 1
res += left_cnt
return res