0921. 使括号有效的最少添加【中等】
1. 📝 题目描述
只有满足下面几点之一,括号字符串才是有效的:
- 它是一个空字符串,或者
- 它可以被写成
AB(A与B连接), 其中A和B都是有效字符串,或者 - 它可以被写作
(A),其中A是有效字符串。
给定一个括号字符串 s,在每一次操作中,你都可以在字符串的任何位置插入一个括号
- 例如,如果
s = "()))",你可以插入一个开始括号为"(()))"或结束括号为"())))"。
返回 为使结果字符串 s 有效而必须添加的最少括号数。
示例 1:
txt
输入:s = "())"
输出:11
2
2
示例 2:
txt
输入:s = "((("
输出:31
2
2
提示:
1 <= s.length <= 1000s只包含'('和')'字符。
2. 🎯 s.1 - 贪心
js
/**
* @param {string} s
* @return {number}
*/
var minAddToMakeValid = function (s) {
let open = 0 // 未匹配的 '('
let close = 0 // 未匹配的 ')'
for (const ch of s) {
if (ch === '(') {
open++
} else {
if (open > 0) open--
else close++
}
}
return open + close
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
- 时间复杂度:
,其中 n 是字符串长度 - 空间复杂度:
,只使用常数额外空间
算法思路:
- 维护
open(未匹配的左括号数)和close(未匹配的右括号数) - 遇到
(,open++;遇到),若有未匹配的左括号则open--,否则close++ - 答案为
open + close