每天一道leetcode:20.有效的括号(简单;栈的经典题目)

⭐今日份题目

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

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。

  2. 左括号必须以正确的顺序闭合。

  3. 每个右括号都有一个对应的相同类型的左括号。

示例1

输入:s = "()"
输出:true

示例2

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

示例3

输入:s = "(]"
输出:false

提示

  • 1 <= s.length <= 104

  • s 仅由括号 '()[]{}' 组成

⭐题目思路

这里还是提取一下题目的特征点:

  • 闭合

  • 按顺序

  • 每个左(右)对应一个右(左)

先考虑明面上的错误情况:

  • 只有左(右)

  • 左右不对应

解题思路是使用,栈的特点是先进后出,完全符合该模式。⭐基本过程是:当我们遇到左括号时,将其压入栈;遇到右括号时,从栈中取出一个符号看是否配对就好

深入来看,还要考虑括号嵌套问题,不需要担心当前右括号需要跨越几个正常的括号组才能找到左括号的问题,如 " { [ ] ) " ,因为,正常的括号组一定早已经经历了配对,所以每次只需要判断栈顶的是否是对应的左括号就好。

该题目是栈相关的简单、经典题目,初学的同学们可以多看几遍,多做几次。

⭐stack补充知识

这里再简单补充一下STL中stack的使用方法。

栈是先进后出,后进先出的数据结构,使用方法主要包括:

//声明
stack<int> s;
//指定底层容器的栈
stack<int,vector<int> > s;
//入栈
s.push(1);
//访问栈顶
s.top();
//从栈顶清除一个元素(只能从栈顶清除)
s.pop();
//判断栈中是否还有元素
s.empty();//无元素的话,empty函数会返回true
//判断栈的元素数量
s.size();
​
//清空栈中的元素
for(int i=s.size();i;i--) s.pop();

⭐代码

class Solution 
{
public:
    bool isValid(string s) 
    {
        stack<char> p;
        for(int i=0;i<s.size();i++)
        {
            if(s[i]=='('||s[i]=='['||s[i]=='{') p.push(s[i]);
            else if(s[i]==')')
            {
                if(p.empty()) return false;
                char cur=p.top();
                p.pop();
                if(cur!='(') return false;       
            }
            else if(s[i]==']')
            {
                if(p.empty()) return false;
                char cur=p.top();
                p.pop();
                if(cur!='[') return false;       
            }
            else if(s[i]=='}')
            {
                if(p.empty()) return false;
                char cur=p.top();
                p.pop();
                if(cur!='{') return false;       
            }
        }
        if(!p.empty()) return false;
        return true;
    }
};

提交结果

我的代码的内存消耗还有待改进,欢迎大家提供更高效的代码,如果过后有更优化的思路我还会继续更新的,大家评论区见!

点赞收藏不迷路⭐~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值