C++ 之LeetCode刷题记录(五)

2023-12-30 16:44:35

😄😊😆😃😄😊😆😃

开始cpp刷题之旅,多学多练,尽力而为。

先易后难,先刷简单的。

在这里插入图片描述

20. 有效的括号

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

有效字符串需满足:

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

示例 1:

输入:s = “()”
输出:true
示例 2:

输入:s = “()[]{}”
输出:true
示例 3:

输入:s = “(]”
输出:false

解法:栈

这个用栈比较容易理解,左括号推栈,右括号出栈,最后检查栈是否为空就行。

我刚开始想法是建个Map,然后检查左右括号数量是否相等,来确定最后的值,但是测试的时候有这种情况“([)]” 。 这种情况左右相等,但是是错的,才发现题目要求括号还要对应着。

class Solution {
public:
    bool isValid(string s) {
        unordered_map<char,int> myData = {
			{'{',-1},
			{'}',1},
			{'[',-2},
			{']',2},
			{'(',-3},
			{')',3}
		};
        stack<char> st;
        bool istrue = true;
        for(int i = 0;i<s.length();i++){
            int temp= myData[s[i]];
            if(temp<0){
                st.push(temp);
            }
            else if(st.size()!=0 && st.top() + temp==0){
                st.pop();
            }
            else{
                istrue =false;
            }
        }
        if(!st.empty()){
            istrue = false;
        }
        return istrue;
    }
};

还是通过建个无序Map,将左右赋值正负两种类型。通过判断栈顶值与当前值是否相加为0。

当循环结束时,栈不为0时,返回false。

当当前值大于0,但是与栈顶相加不为0 ,说明不对应,也返回false。

当当前值大于0,栈却为空,说明首先出现了右括号,返回false。

看一下提交记录。

在这里插入图片描述
OK,到此结束,工作再忙,但也要坚持每天一题。

文章来源:https://blog.csdn.net/aizzl97/article/details/135297218
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。