LeetCode题目笔记——921. 使括号有效的最少添加

题目描述——截图

在这里插入图片描述

题目描述——文字

只有满足下面几点之一,括号字符串才是有效的:

它是一个空字符串,或者 它可以被写成 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),感觉这个题应该算简单题的,不知道为啥难度定义为中等。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值