11.5 leetcode打卡

11.5 leetcode打卡

20.有效的括号

原题链接:20. 有效的括号

题目描述

给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。有效字符串需满足:

左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。

输入:s = "()[]{}"
输出:true

解题思路

通过HashMap为每个( ), { }, [ ] 分配一个对应的value,此处用的是数字(方便后续判断)。

然后利用栈先进后出的特点,来依次判断每个括号是否与之匹配。

依次遍历字符串的字符,若为左半边括号,则压入栈中, 若为右半边,则(若栈不空)判断栈顶元素是否与之匹配,若匹配则弹出栈顶元素,若不匹配则直接返回false即可。

代码实现

class Solution {
public:
    bool isValid(string s) {
        unordered_map<char, int> map = {{'(', 1}, {'{', 2}, {'[', 3},
        {')', 4}, {'}', 5}, {']', 6}};
        bool ans = true;
        stack<char> stack;
        for(char ch: s){
            int num = map[ch];
            if(num >= 1 && num <= 3){
                stack.push(ch);
            }else if(!stack.empty() && map[stack.top()] == num -3){
                stack.pop();
            }else{
                ans = false; break;
            }
        }
        if(!stack.empty()){
                ans = false;
            }
        return ans;
        
    }
};

32.最长有效括号

原题链接:32. 最长有效括号

题目描述

给你一个只包含 '('')' 的字符串,找出最长有效(格式正确且连续)括号子串的长度。

输入:s = ")()())"
输出:4
解释:最长有效括号子串是 "()()"

代码实现

class Solution {
public:
    int longestValidParentheses(string s) {
        int len = s.size(), ans = 0;   
        vector<int> dp(len + 1, 0);

        for (int i = 1; i < len; i++) {

            if (s[i] == ')' && i - dp[i] - 1 >= 0 && s[i - dp[i] - 1] == '(') {
                //dp[i - dp[i] - 1]对应当前子串前刚好存在有效子串的情况"()(())"
                dp[i + 1] = dp[i] + 2 + dp[i - dp[i] - 1];
            }
            ans = max(ans, dp[i + 1]);
        }
        return ans;
    }
};

155.最小栈

原题链接:155. 最小栈

题目描述

设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。

实现 MinStack 类:

MinStack() 初始化堆栈对象。
void push(int val) 将元素val推入堆栈。
void pop() 删除堆栈顶部的元素。
int top() 获取堆栈顶部的元素。
int getMin() 获取堆栈中的最小元素。

输入:
["MinStack","push","push","push","getMin","pop","top","getMin"]
[[],[-2],[0],[-3],[],[],[],[]]

输出:
[null,null,null,null,-3,null,0,-2]

代码实现

class MinStack {
    stack<int> x_stack;
    stack<int> min_stack;
public:
    MinStack() {
        min_stack.push(INT_MAX);
    }
    
    void push(int x) {
        x_stack.push(x);
        min_stack.push(min(min_stack.top(), x));
    }
    
    void pop() {
        x_stack.pop();
        min_stack.pop();
    }
    
    int top() {
        return x_stack.top();
    }
    
    int getMin() {
        return min_stack.top();
    }
};
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值