力扣第20题 有效的括号

前言

记录一下刷题历程 力扣第20题 有效的括号 使用栈


有效的括号

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

有效字符串需满足:

左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。

示例 1:

输入:s = “()”

输出:true

示例 2:

输入:s = “()[]{}”

输出:true

示例 3:

输入:s = “(]”

输出:false

示例 4:

输入:s = “([])”

输出:true

分析

我们可以准备一个杯子 假如我们先放入"(“在放入”)“因为是匹配的,所以我们消除,此时这个杯子里是空的,我们可以认为都是有效的括号。假如我们放入一个”(“,再放入一个”[“,在加一个“]”此时“[”和杯子顶“]”是匹配的所以我们消除它,我们再放入一个”}"发现和杯子顶部“(”是不匹配的所以我们返回false 而这个杯子就是栈

代码如下:

class Solution {
public:
    bool isValid(string s) {
        stack<char> st; // 定义一个字符类型的栈 st,用于存储左括号
        for (auto& ch : s) { // 遍历字符串 s 中的每一个字符 ch
            if (ch == '(' || ch == '[' || ch == '{') { // 如果字符是左括号
                st.push(ch); // 将左括号压入栈中
            } else if (!st.empty() && isMatch(st.top(), ch)) { // 如果字符是右括号且栈不为空,并且能与栈顶的左括号匹配
                st.pop(); // 弹出栈顶的左括号,表示匹配成功
            } else {
                return false; // 如果以上条件都不满足,返回 false,说明括号不匹配
            }
        }
        if (st.empty()) { // 如果栈为空,说明所有左括号都找到了匹配的右括号
            return true; // 返回 true,表示括号匹配
        }
        return false; // 否则返回 false,表示有未匹配的左括号
    }
    
    bool isMatch(char& left, char& right) {
        if (left == '(' && right == ')') {
            return true; // 如果 left 是 '(',right 是 ')',返回 true,表示匹配
        } else if (left == '[' && right == ']') {
            return true; // 如果 left 是 '[',right 是 ']',返回 true,表示匹配
        } else if (left == '{' && right == '}') {
            return true; // 如果 left 是 '{',right 是 '}',返回 true,表示匹配
        } else {
            return false; // 否则返回 false,表示不匹配
        }
    }
};

解释注释

1.stack st;

定义一个 stack 类型的栈 st,用于存储左括号,帮助进行括号匹配的判断。
遍历字符串:

2.for (auto& ch : s) { … }

使用 for 循环遍历字符串 s 中的每一个字符 ch。

3.判断左括号:

if (ch == ‘(’ || ch == ‘[’ || ch == ‘{’) { … }
如果当前字符 ch 是左括号 (、[ 或 {,则将其压入栈 st 中。

4.判断右括号并匹配:

else if (!st.empty() && isMatch(st.top(), ch)) { … }
如果当前字符 ch 是右括号,并且栈 st 不为空,并且 ch 能与栈顶的左括号匹配(通过 isMatch 函数判断),则将栈顶的左括号弹出,表示匹配成功。

5.未匹配情况处理:

else { return false; }
如果 ch 不是左括号且与栈顶的左括号不匹配,则返回 false,表示括号不匹配。

6.最终检查:

if (st.empty()) { return true; }
如果遍历完字符串后栈 st 为空,说明所有左括号都找到了匹配的右括号,返回 true。
return false;
否则返回 false,表示有未匹配的左括号。

7.isMatch 函数:

bool isMatch(char& left, char& right) { … }
isMatch 函数用于判断给定的左右括号是否匹配,根据左括号 left 和右括号 right 的对应关系进行判断,返回 true 表示匹配,返回 false 表示不匹配。

时间复杂度

这段代码利用栈的特性实现了对字符串中括号匹配的检查。通过遍历字符串,将左括号压入栈中,并在遇到右括号时与栈顶的左括号进行匹配,从而判断括号是否正确闭合。这种方法简洁高效,时间复杂度为 O(n),适用于处理括号匹配等问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值