Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
一.题目
1541. 平衡括号字符串的最少插入次数 给你一个括号字符串
s,它只包含字符'('和')'。一个括号字符串被称为平衡的当它满足:
- 任何左括号
'('必须对应两个连续的右括号'))'。 - 左括号
'('必须在对应的连续两个右括号'))'之前。 比方说"())","())(())))"和"(())())))"都是平衡的,")()","()))"和"(()))"都是不平衡的。
你可以在任意位置插入字符 '(' 和 ')' 使字符串平衡。
请你返回让 s 平衡的最少插入次数。
示例 1:
输入:s = "(()))"
输出:1
解释:第二个左括号有与之匹配的两个右括号,但是第一个左括号只有一个右括号。我们需要在字符串结尾额外增加一个 ')' 使字符串变成平衡字符串 "(())))" 。
示例 2:
输入: s = "())"
输出: 0
解释: 字符串已经平衡了。
示例 3:
输入: s = "))())("
输出: 3
解释: 添加 '(' 去匹配最开头的 '))' ,然后添加 '))' 去匹配最后一个 '(' 。
示例 4:
输入: s = "(((((("
输出: 12
解释: 添加 12 个 ')' 得到平衡字符串。
示例 5:
输入:s = ")))))))"
输出:5
解释:在字符串开头添加 4 个 '(' 并在结尾添加 1 个 ')' ,字符串变成平衡字符串 "(((())))))))" 。
提示:
1 <= s.length <= 10^5s只包含'('和')'。
二、思路分析:
这道题是一个难度为中等的题目,题目的思路基本上与上一篇所写的题目的思路是一致的,对于上一篇左括号对应右括号只要一个即可完成匹配,而这道题的要求是左括号出现一次,那么右括号就需要出现连续的两次才能够达到括号平衡。
所以这道题我们使用类似于栈的思路但不是用栈结构来进行求解,每次当左括号出现的时候,rneed就需要计数两次,当右括号出现的时候我们就要判断它的下一位字符是不是右括号,如果是就让rneed计数减2,如果不是结果计数加一即可。
三、代码:
/**
* @param {string} s
* @return {number}
*/
var minInsertions = function (s) {
let rneed = 0
let res = 0
for (let i = 0; i < s.length; i++) {
//如果使左括号那么rneed+
if (s[i] == '(') rneed += 2
// 如果是右括号那么需要查看它后一位的是不是右括号否则res+1
if (s[i] == ')') {
if (s[i + 1] == ')') {
i += 1
rneed -= 2
} else {
//不是连续的右括号
res++
rneed -= 2
}
if (rneed == -2) {
res++
rneed = 0
}
}
}
return rneed + res
};
四、总结:
这道题的思路与上一篇的思路几乎没有什么两样,我们只需要处理不同情况下的细节即可。但是这道题需要注意
rneed的计数情况特别是在遇到右括号的时候。