使括号有效的最少添加
Category | Difficulty | Likes | Dislikes |
---|---|---|---|
algorithms | Medium (73.02%) | 234 | - |
只有满足下面几点之一,括号字符串才是有效的:
- 它是一个空字符串,或者
- 它可以被写成
AB
(A
与B
连接), 其中A
和B
都是有效字符串,或者 - 它可以被写作
(A)
,其中A
是有效字符串。
给定一个括号字符串 s
,在每一次操作中,你都可以在字符串的任何位置插入一个括号
- 例如,如果
s = "()))"
,你可以插入一个开始括号为"(()))"
或结束括号为"())))"
。
返回 为使结果字符串 s
有效而必须添加的最少括号数。
示例 1:
输入:s = "())"
输出:1
示例 2:
输入:s = "((("
输出:3
提示:
1 <= s.length <= 1000
s
只包含'('
和')'
字符。
思路:
- 核心思路是以左括号为基准,通过维护对右括号的需求数,来求计算的最小的插入数。
- 错误的思路:
- 记录左括号的数量,记录右括号的数量,右括号数量减去左括号数量的abs值就是需要添加的括号数。
- 这样会出现这个特殊情况
- ( ) ) ) ( ( 第一组()去掉之后需要补充两个左括号和两个右括号也就是**((()))(())**
- 所以再加上判断就可以。
答案:
class Solution {
public int minAddToMakeValid(String s) {
// if (s == "" || s == null) {
// return 0;
// }
// int zNum = 0;
// int yNum = 0;
// int ans = 0;
// for (char c : s.toCharArray()) {
// if (c == '(') {
// zNum++;
// } else if (c == ')') {
// yNum++;
// }
// ans = yNum - zNum;
// }
// return Math.abs(ans);
// }
// res 记录插入次数
int res = 0;
// need 变量记录右括号的需求量
int need = 0;
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == '(') {
// 对右括号的需求+1
need++;
}
if (s.charAt(i) == ')') {
// 对右括号的需求-1
need--;
if (need == -1) {
need = 0;
// 需插入一个左括号
res++;
}
}
}
return res + need;
}
}