每日一题——有效的括号

78 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

题目描述

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

有效字符串需满足:

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

示例 1:

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

示例 2:

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

示例 3:

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

示例 4:

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

示例 5:

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

提示:

  • 1 <= s.length <= 104
  • s 仅由括号 '()[]{}' 组成

思路

根据题意发现这是一道字符串的匹配问题,面对这种问题我们可以借助栈的先进后出的性质进行解决。遍历字符串s,由于后遇到的左括号要先闭合,所以我们将这个左括号放入栈中,使其成为栈顶元素;当遇到一个右括号时,我们取出栈顶元素进行匹配,如果栈为空或者括号不能够进行匹配,我们就返回结果false。

为了快速判断括号的类型,我们可以使用c++的stl哈希表存储每一种括号。哈希表的键为右括号,值为相同类型的左括号。这样做事半功倍。

代码

class Solution {
public:
    bool isValid(string s) {
    
    // 如果字符串长度为奇数,直接返回
    int length = s.size();
    if(length % 2 != 0) return false;
    // 对hashmap进行初始化,哈希表的键为右括号,值为相同类型的左括号
    unordered_map<char, char> hashmap = {
            {')', '('},
            {']', '['},
            {'}', '{'}
        };
    stack<char> ch;
​
    for(int i = 0;i < length;i ++)
    {
       
 
        if(hashmap.count(s[i])){
            // 开始进行比较
            // cout << ch.top();
            // 判断栈是否为空,括号类型能否匹配
            if(ch.empty() || ch.top() != hashmap[s[i]]) return false;
            ch.pop();
​
        }else{
            ch.push(s[i]);
        }
    }
    // cout << ch.size() << endl;
    // 如果栈中元素为空,代表全部括号匹配完毕
    return ch.empty();
​
    }
};