平衡括号字符串的最少插入次数
Category | Difficulty | Likes | Dislikes |
---|---|---|---|
algorithms | Medium (48.50%) | 61 | - |
给你一个括号字符串 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
只包含'('
和')'
。
思路:
- 遍历字符串,通过一个need变量来记录对右括号的需求数,根据need的变化来判断是否需要插入。
- 当need == -1时候,意味着我们遇到一个多余的右括号,显然需要插入一个右括号。
- 当遇到左括号时,如果对右括号的需求量为奇数,则需要插入一个右括号,因为一个左括号需要两个右括号,右括号的需求数必须是偶数。
答案:
class Solution {
public int minInsertions(String s) {
//排除特殊情况
if (s == "" || s == null) {
return 0;
}
//定义右括号的需求量need和左括号的需求量res;
int res = 0, need = 0;
//遍历数组。
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
//当c == 左括号的时候
if (c == '(') {
//右括号的需求数+2
need += 2;
//当右括号的需求数为奇数的时候
if (need % 2 == 1) {
//res++插入的次数+1,右括号的需求数-1;
res++;
need--;
}
}
//当c == 右括号的时候
if (c == ')') {
//右括号的需求数-1;
need--;
//当右括号的需求数为-1的时候
if (need == -1) {
//插入次数+1;需求数为1;
res++;
need = 1;
}
}
}
//返回插入次数和需求书的和为答案
return res + need;
}
}