5470. 平衡括号字符串的最少插入次数
题目描述:
给你一个括号字符串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
只包含'('
和 ')'
。
解题思路:
成为平衡括号字符串
的条件:
循环内部处理的:
1)、处理当连续的')'
个数不为偶数个时候,要增加一个')'
使之连续的')'
为偶数个,使之成为平衡成为可能;
2)、处理当')'
的个数大于'('
的二倍,则需要增加'('
的个数;
循环结束的时候处理的:
3)、最后再增加numL * 2 - numR
个')'
;就可以成为平衡括号字符串了;
代码实现:
class Solution {
public:
int minInsertions(string s) {
int i ;
int ret = 0 ;
int numR = 0 , numL = 0 ;
int tmp = 0 ;
for (i = 0 ; i < s.size() ; i ++)
{
if (s[i] == '(') numL ++ ;
else
{//当出现')'只有一个的时候需要增加一个')'使之成对;
tmp = 1 ;
if (i + 1 < s.size() && s[i + 1] == ')' )
{
i ++ ;
tmp = 2 ;
}
if (tmp & 1) {
ret ++ ;
}
numR += 2 ;
}
//当')'的数量大于'('数量的两倍,需要增加一个'('
if (numR > numL * 2)
{
ret ++ ;
numL ++ ;
}
}
ret += (numL * 2 - numR) ;
return ret ;
}
};
复杂度计算:
时间复杂度 O(s.length())
;
空间复杂度O(1)
;