题目描述——截图
题目描述——文字
只有满足下面几点之一,括号字符串才是有效的:
它是一个空字符串,或者 它可以被写成 AB (A 与 B 连接), 其中 A 和 B 都是有效字符串,或者 它可以被写作 (A),其中 A
是有效字符串。 给定一个括号字符串 s ,移动N次,你就可以在字符串的任何位置插入一个括号。例如,如果 s = “()))” ,你可以插入一个开始括号为 “(()))” 或结束括号为 “())))” 。 返回 为使结果字符串 s
有效而必须添加的最少括号数。示例 1:
输入:s = “())” 输出:1 示例 2:
输入:s = “(((” 输出:3 提示:
1 <= s.length <= 1000 s 只包含 ‘(’ 和 ‘)’ 字符。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/minimum-add-to-make-parentheses-valid
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题目难度——中等
方法一:利用一个栈来遍历
看到这个题目想起了当初教数据结构时讲栈的时候的题目,跟这个也差不多,同样的解法。思路就是在遍历的过程中利用一个栈来保存遇到过的字符,每次遇到新字符时判断新字符和栈顶字符是否能成对“()”,能的话就把栈顶元素弹出,否则入栈新字符,最后遍历完,栈中剩下的字符就是无法满足题目要求的,需要插入新括号使其配对,返回栈的大小即可。考虑到本题给的输入字符串中只会出现左右括号,所以我们不用考虑其他的。
By the way,需要在初始化栈的时候添加一个空字符或者其他无关字符。因为在遍历第一个字符的时候栈是空的,如果直接访问栈顶的话,会报错。(Python和C艹都是这样,所以我在这里先添加了一个额外的字符,如果有哪位大佬有更好的办法,欢迎在评论区指教。(撒花))
代码/Python
class Solution:
def minAddToMakeValid(self, s: str) -> int:
stack = ['']
for w in s:
if stack[-1] == '(' and w == ')':
del stack[-1]
else:
stack.append(w)
return len(stack) - 1
分别超过100%和89%。
代码/C++
class Solution {
public:
int minAddToMakeValid(string s) {
stack<char> char_stack;
char_stack.push('x');
for(auto &w:s){
if(w == ')' && char_stack.top() == '('){
char_stack.pop();
}
else{
char_stack.push(w);
}
}
return char_stack.size() - 1;
}
};
总结
这种方法时间是O(N),空间嘛,最坏也是O(N),感觉这个题应该算简单题的,不知道为啥难度定义为中等。