力扣20 有效的括号

题目

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

有效字符串需满足:

  • 左括号必须用相同类型的右括号闭合。
  • 左括号必须以正确的顺序闭合。
    注意空字符串可被认为是有效字符串。
输入 输出
示例1 ( ) true
示例2 ( )[ ]{ } true
示例3 ( ] false
示例4 ( [ ) ] false
示例5 { [ ] } true

解决方案

  • 思路:利用栈

首先若能全部配对,一定是偶数个,所以如果是奇数,则直接返回false;
建立一个哈希表,将三对存入map里,然后建立栈,开始遍历字符串s,
若匹配到左括号: ’ [ ’ ’ ( ’ ’ { ’ 放入栈中,
若匹配到右括号: ’ ] ’ ’ ) ’ ’ } '先判断栈是否为空,若为空,直接返回false,若不为空,判断是否与栈顶元素匹配,若匹配则删除栈顶元素,若不匹配,直接返回false;
当s遍历完毕后,若栈为空,则说明恰好完全匹配,返回true,否则返回false。

  • 代码:
class Solution {
public:
    bool isValid(string s) {
        if(s.length()%2!=0) return false;
        map<char,char> Map;//建立哈希表
        Map.insert(map<char,char>::value_type(')','('));
        Map.insert(map<char,char>::value_type(']','['));
        Map.insert(map<char,char>::value_type('}','{'));
        stack<char> Mapstack;    //建立映射
        for(int i=0;i<s.length();i++)
        {
            if(s[i]=='['||s[i]=='{'||s[i]=='(')
                Mapstack.push(s[i]);     //放入栈中
            else if(s[i]==']'||s[i]=='}'||s[i]==')')
            {
                if(Mapstack.empty()) return false;
            
                if(Map[s[i]]==Mapstack.top())   //与栈顶元素进行匹配
                {
                    Mapstack.pop();  //匹配成功删除栈顶元素
                }
                else return false;
            }
        }
        if(Mapstack.empty()) return true;
        else return false;
    }
};
  • 注意事项:在使用map映射时,其时间复杂度比用三个if高,所以在实践情况下,应该用if

  • 执行结果:

在这里插入图片描述

发布了15 篇原创文章 · 获赞 1 · 访问量 298

猜你喜欢

转载自blog.csdn.net/Janna_woo/article/details/104561946