题解 | 有效括号序列

有效括号序列

https://www.nowcoder.com/practice/37548e94a270412c8b9fb85643c8ccc2?tpId=295&tqId=23268&sourceUrl=%2Fexam%2Foj%3FquestionJobId%3D10%26subTabName%3Donline_coding_page

class Solution {
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param s string字符串
     * @return bool布尔型
     */
    bool isValid(string s) {
        stack<char> st;
        unordered_map<char, char> mapping = {
            {')', '('},
            {']', '['},
            {'}', '{'}
        };

        for (char c : s) {
            // 如果是闭括号
            if (mapping.find(c) != mapping.end()) {
                // 如果栈为空,用特殊字符表示
                char top_element = st.empty() ? '#' : st.top();

                // 如果栈顶元素不匹配当前闭括号对应的开括号
                if (top_element != mapping[c]) {
                    return false;
                }
                // 匹配成功,弹出栈顶元素
                st.pop();
            } else {
                // 如果是开括号,压入栈中
                st.push(c);
            }
        }

        // 最后检查栈是否为空
        return st.empty();
    }
};

为了解决这个问题,我们需要判断给定的括号字符串是否有效。有效的括号字符串必须满足以下条件:
每个开括号必须有对应的闭括号。
括号必须正确嵌套,即闭括号必须按顺序匹配最近的开括号。

方法思路
栈的使用:利用栈的后进先出(LIFO)特性来匹配括号。遍历字符串时,遇到开括号就压入栈中,遇到闭括号则检查栈顶元素是否与之匹配。
提前终止:如果遇到闭括号时栈为空或栈顶元素不匹配,可以立即返回false,因为这意味着括号不按正确顺序闭合。
最终检查:遍历完字符串后,如果栈为空,说明所有括号都正确匹配,返回true;否则返回false。

代码解释
初始化:创建一个空栈和一个字典mapping,用于存储闭括号到开括号的映射。
遍历字符:对于字符串中的每个字符:
如果是闭括号,检查栈顶元素是否匹配。若栈为空或栈顶元素不匹配,返回false。
如果是开括号,压入栈中。
最终检查:遍历结束后,栈为空则返回true,否则返回false。
这种方法确保在O(n)时间内解决问题,其中n是字符串的长度,空间复杂度为O(n)用于栈的存储。

栈/堆/队列 文章被收录于专栏

操作只能在栈顶进行 栈应用场景 函数调用栈 浏览器前进后退 括号匹配检查 表达式求值 变种队列 双端队列 (Deque):两端都可以入队和出队 优先队列 (Priority Queue):按优先级出队 循环队列:固定大小的循环使用空间 队列应用场景 消息队列 任务调度 广度优先搜索 打印任务队列 堆应用场景 优先队列实现 堆排序 Top K 问题 定时任务调度

全部评论

相关推荐

牛客28967172...:跟着卡子哥才是正道,灵茶属实不太行
点赞 评论 收藏
分享
04-03 22:41
兰州大学 C++
老六f:有时候是HR发错了,我之前投的百度的后端开发,他给我发的算法工程师,但是确实面的就是百度开发
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务