字符串/栈有效的括号(leetcode20)

Posted AI 菌

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字符串/栈有效的括号(leetcode20)相关的知识,希望对你有一定的参考价值。

一、题目

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

有效字符串需满足:

左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。

在这里插入图片描述

二、分析

有效的括号应该满足:每一个左括号,在恰当的位置都会有一个右括号与之对应。

简单来讲,本题可看作是一个消消乐游戏,从左向右遍历字符串,当左括号找到恰当位置的右括号时,就将这对括号消掉。当遍历结束时,所有的括号对都消除了,那么字符串s满足要求,返回true;否则,返回false。

由于是按照从左向右固定的顺序遍历,所以先出现的左括号一定是后消掉的。因此,自然联想到使用栈的性质——先进后出,来解决此题。

对于本题,具体步骤如下:

  • 从左向右依次遍历字符串的每一个字符
  • 如果字符是左括号,则存入栈中;如果是右括号,则做进一步判断
  • 如果是右括号,先判断此时栈是否为空。如果是空的,则右括号无法小消除,返回false;如果栈不是空的,再将此字符于栈顶元素进行比较,判断是否符合条件。
  • 当遍历完所有字符元素,判断栈是否为空。如果是空,说明所有括号都消掉了,返回true;否则,返回fasle。

三、题解

根据以上的分析,C++实现如下:

class Solution {
public:
    stack<char> stk;
    unordered_map<char, char> pairs = { {'(', ')'}, {'[', ']'}, {'{', '}'} };
   
    bool isValid(string s) {
        for(int i=0; i<s.size(); ++i)
        {
            if(s[i]=='(' || s[i]=='{' || s[i]=='['){
                stk.push(s[i]); //如果是左括号,则存入栈中
            }
            else{  //如果是右括号,则和栈顶元素进行比较
                if(!stk.empty() && s[i]==pairs[stk.top()]){ 
                    stk.pop();
                }
                else{
                    return false;
                }
            }
        }
        if(stk.empty())
            return true;
        else
            return false;
    }
};

提交结果如下:
在这里插入图片描述

以上是关于字符串/栈有效的括号(leetcode20)的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode刷题100天—20. 有效的括号(栈)—day02

Leetcode刷题100天—20. 有效的括号(栈)—day02

LeetCode第20题——有效的括号

LeetCode实现20 有效的括号,739每日的温度

python(LeetCode20-有效的括号)

leetcode 每日一题 20. 有效的括号