持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第6天,点击查看活动详情
力扣——921. 使括号有效的最少添加
921. 使括号有效的最少添加
只有满足下面几点之一,括号字符串才是有效的:
-
它是一个空字符串,或者
-
它可以被写成 AB (A 与 B 连接), 其中 A 和 B 都是有效字符串,或者
-
它可以被写作 (A),其中 A 是有效字符串。
给定一个括号字符串 s ,移动N次,你就可以在字符串的任何位置插入一个括号。
例如,如果 s = "()))" ,你可以插入一个开始括号为 "(()))" 或结束括号为 "())))" 。 返回 为使结果字符串 s 有效而必须添加的最少括号数。
示例 1:
输入:s = "())"
输出:1
示例 2:
输入:s = "((("
输出:3
提示:
-
1 <= s.length <= 1000
-
s 只包含 '(' 和 ')' 字符。
问题解析
可以用栈sta来模拟左括号右括号,变量cnt记录为使结果字符串 s 有效而必须添加的最少括号数。
遍历字符串,如果当前字符是‘(',将括号入栈;如果当前字符是')',将栈顶弹出,当:
- 当前字符为’)‘而栈为空时,说明我们要在前面加上一个左括号,cnt++。
- 当字符串全部遍历完,而栈不为空时,说明我们要在后面加上sta.size()个右括号,cnt+=sta.size()。
最后将cnt返回即可。
时间复杂度:O(n)
空间复杂度:O(n)
class Solution {
public:
int minAddToMakeValid(string s) {
stack<char>sta;
int cnt=0;
for(auto&i:s)
{
if(i=='(')
sta.push(i);
else
{
if(sta.empty())cnt++;
else sta.pop();
}
}
cnt+=sta.size();
return cnt;
}
};
我们也可以简化一下,去掉栈,用一个变量ans来记录左括号的数量。
当前为左括号时,ans++;为右括号时,ans--,如果ans已经为0,则cnt++。
最后给cnt加上ans的值。
时间复杂度:O(n)
空间复杂度:O(1)
class Solution {
public:
int minAddToMakeValid(string s) {
int cnt=0,ans=0;
for(auto&i:s)
{
if(i=='(')
ans++;
else
{
if(ans==0)cnt++;
else ans--;
}
}
cnt+=ans;
return cnt;
}
};