1. 问题描述:
给你一个括号字符串 s ,它只包含字符 '(' 和 ')' 。一个括号字符串被称为平衡的当它满足:
任何左括号 '(' 必须对应两个连续的右括号 '))' 。
左括号 '(' 必须在对应的连续两个右括号 '))' 之前。
比方说 "())", "())(())))" 和 "(())())))" 都是平衡的, ")()", "()))" 和 "(()))" 都是不平衡的。
你可以在任意位置插入字符 '(' 和 ')' 使字符串平衡。
请你返回让 s 平衡的最少插入次数。
示例 1:
输入:s = "(()))"
输出:1
解释:第二个左括号有与之匹配的两个右括号,但是第一个左括号只有一个右括号。我们需要在字符串结尾额外增加一个 ')' 使字符串变成平衡字符串 "(())))" 。
示例 2:
输入:s = "())"
输出:0
解释:字符串已经平衡了
示例 3:
输入:s = "))())("
输出:3
解释:添加 '(' 去匹配最开头的 '))' ,然后添加 '))' 去匹配最后一个 '(' 。
示例 4:
输入:s = "(((((("
输出:12
解释:添加 12 个 ')' 得到平衡字符串。
示例 5:
输入:s = ")))))))"
输出:5
解释:在字符串开头添加 4 个 '(' 并在结尾添加 1 个 ')' ,字符串变成平衡字符串 "(((())))))))" 。
提示:
1 <= s.length <= 10^5
s
只包含'('
和')'
。
2. 思路分析:
① 一开始的时候想到使用两个变量来记录左右括号的数目但是具体怎么样处理没有思路,不过感觉处理起来会比较麻烦,看了一下力扣官网的题解发现它们的思路真的好好,我的理解如下:
使用两个变量leftCount,insertions进行记录,其中一个变量维护左括号的数量,另外一个用来记录需要插入的括号数量,分析可题目可以知道维护左括号的数目是比较方便的,匹配起来会比较方便,当我们遇到左括号的时候对leftCount加1,当遇到右括号的时候首先判断有木有左括号与之匹配假如有那么将左括号的数目减1,没有则插入括号的数目加1,然后再判断下一个字符是否是右括号,假如是那么将遍历的位置加2即可,不是右括号那么将插入括号的数目加1,最后再处理剩余的左括号的数目即可
② 感觉在做题的时候需要多根据具体的例子来分析情况这样才会更有思路
3. 代码如下:
力扣官方代码:
class Solution:
def minInsertions(self, s: str) -> int:
length = len(s)
insertions = leftCount = index = 0
while index < length:
if s[index] == "(":
leftCount += 1
index += 1
else:
if leftCount > 0:
leftCount -= 1
else:
insertions += 1
if index < length - 1 and s[index + 1] == ")":
index += 2
else:
insertions += 1
index += 1
insertions += leftCount * 2
return insertions