LeetCode 1541. Minimum Insertions to Balance a Parentheses String
LeetCode 1541. Minimum Insertions to Balance a Parentheses String (平衡括号字符串的最少插入次数)
题目
链接
https://leetcode-cn.com/problems/minimum-insertions-to-balance-a-parentheses-string/
问题描述
给你一个括号字符串 s ,它只包含字符 '(' 和 ')' 。一个括号字符串被称为平衡的当它满足:
任何左括号 '(' 必须对应两个连续的右括号 '))' 。
左括号 '(' 必须在对应的连续两个右括号 '))' 之前。
比方说 "())", "())))" 和 "())))" 都是平衡的, ")()", "()))" 和 ")" 都是不平衡的。
你可以在任意位置插入字符 '(' 和 ')' 使字符串平衡。
请你返回让 s 平衡的最少插入次数。
输入:s = ")"
输出:1
解释:第二个左括号有与之匹配的两个右括号,但是第一个左括号只有一个右括号。我们需要在字符串结尾额外增加一个 ')' 使字符串变成平衡字符串 "))" 。
示例
输入:s = ")"
输出:1
解释:第二个左括号有与之匹配的两个右括号,但是第一个左括号只有一个右括号。我们需要在字符串结尾额外增加一个 ')' 使字符串变成平衡字符串 "))"
提示
1 <= s.length <= 10^5
s 只包含 '(' 和 ')' 。
思路
同样思路,从左向右,不过需要注意,添加时左括号应该一直在左边,need的奇偶性要注意。
最后输出结果。
复杂度分析
时间复杂度 O(n)
空间复杂度 O(1)
代码
Java
public int minInsertions(String s) {
char[] ch = s.toCharArray();
int need = 0;
int ans = 0;
for (char c : ch) {
if (c == '(') {
need+=2;
if(need%2==1){
ans++;
need--;
}
}else {
need--;
if(need==-1){
ans++;
need=1;
}
}
}
return ans + need;
}