【icyle】Leetcode-cn:20. 有效的括号

题目

注:此处有多种思路,这里只选择了一种容易理解且简单的方法。

解答:发现题目的“潜规则”

思路

408专业课中明确讲到,括号匹配的一个优秀方法就是栈匹配。
具体规则请看代码部分。

需要的头文件

从此题开始,不再列出头文件内容,具体请看代码部分。
(其实是觉得这部分好没用啊,写来干嘛,又不是看不懂代码)

代码
/*
 * @lc app=leetcode.cn id=20 lang=cpp
 *
 * [20] 有效的括号
 */

// @lc code=start
#include <string>
#include <stack>
#include <unordered_map>
using namespace std;
class Solution
{
public:
    bool isValid(string s)
    {
        //奇数个符号一定无效
        int n = s.size();
        if (n % 2 == 1)
        {
            return false;
        }

        //初始化存放括号的栈
        stack<char> brackets;

        //分析:必须以正确的顺序闭合,这就说明括号成对挨着出现才是有效的,且左括号一定在右括号左边
        //用map类型就可以实现“对应”
        //规则:左括号直接入栈;对于右括号,如果栈顶可匹配,则左括号出栈,继续检查下个括号;如果栈顶不匹配,直接返回无效。
        //408中基本的栈应用的例子

        //建立map,注意key-value顺序
        unordered_map<char, char> brackets_pairs = {{')', '('}, {']', '['}, {'}', '{'}};

        //按照规则检查
        for (char ch : s)
        {
            //count是找key的,而key都是右括号,所以如果count返回1,那么当前括号一定是右括号,否则是左括号
            if (brackets_pairs.count(ch))
            {
                //匹配则弹出左括号
                if (!brackets.empty() && brackets.top() == brackets_pairs[ch])
                {
                    brackets.pop();
                }
                else //否则返回无效
                {
                    return false;
                }
            }
            else //左括号直接入栈
            {
                brackets.push(ch);
            }
        }
        //栈空证明匹配成功有效,不空则无效
        return brackets.empty();
    }
};
// @lc code=end
时间复杂度和空间复杂度
  • 时间复杂度: O(N) ,N为链表长度。

  • 空间复杂度:O(N+K) 。因为开辟了一个长度为N的栈空间,同时存储哈希表也需要空间,此处有6个字符进行匹配,所以K=6,其他情况同理分析。

反思与总结

基本题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值