为了账号安全,请及时绑定邮箱和手机立即绑定

洛谷P10472题解:使用栈高效求解最长有效括号子串

标签:
C++

https://img1.sycdn.imooc.com/e43846680880798a09620758.jpg

一、问题描述

给定一个包含'('、')'、'['、']'、'{'、'}'的字符串,找出其中最长的有效括号子串的长度。有效括号子串需要满足括号正确匹配且连续。

二、算法核心思想

  1. 的巧妙应用:使用栈记录未匹配括号的位置

  2. 边界处理:初始时压入-1作为虚拟边界

  3. 动态更新:每次匹配成功时计算当前有效长度

三、完整代码实现(带详细注释)

#include <iostream>#include <stack>#include <vector>using namespace std;int longestValidParentheses(string s) {
    stack<int> st;
    st.push(-1); // 初始边界,用于计算长度
    int max_len = 0;
    
    // 遍历字符串中的每个字符
    for(int i = 0; i < s.size(); i++) {
        // 如果是左括号,压入栈中
        if(s[i] == '(' || s[i] == '[' || s[i] == '{') {
            st.push(i);
        } else {
            // 如果是右括号且栈不为空
            if(!st.empty() && st.top() != -1) {
                char top_char = s[st.top()];
                // 检查括号是否匹配
                if((top_char == '(' && s[i] == ')') ||
                   (top_char == '[' && s[i] == ']') ||
                   (top_char == '{' && s[i] == '}')) {
                    st.pop(); // 匹配成功,弹出左括号
                    max_len = max(max_len, i - st.top()); // 更新最大长度
                } else {
                    st.push(i); // 不匹配,压入当前位置
                }
            } else {
                st.push(i); // 栈为空或只有虚拟边界,压入当前位置
            }
        }
    }
    return max_len;}int main() {
    string s;
    cin >> s;
    cout << longestValidParentheses(s) << endl;
    return 0;}
四、算法分步解析

四、算法分步解析

  1. 初始化栈

  • 压入-1作为虚拟边界,便于后续长度计算

  • 初始化max_len为0,记录最大有效长度

遍历处理

  • 遇到左括号:压入栈中

  • 遇到右括号:检查栈顶是否匹配

  • 匹配成功:弹出栈顶,计算当前有效长度

  • 匹配失败:压入当前位置作为新边界

结果计算

  • 每次成功匹配后,i - st.top()即为当前有效长度

  • 使用max函数保持最大长度

五、常见误区与调试技巧

  1. 忘记初始化虚拟边界

  2. 未正确处理不匹配情况

  3. 长度计算错误

  4. 栈空判断遗漏

六、扩展思考

  1. 如何修改算法只处理小括号?

  2. 如果不使用栈,能否用动态规划解决?

  3. 如何统计所有有效括号子串而不仅是最大长度?

  4. 如何扩展到多行文本的括号匹配

来源:洛谷题解


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

举报

0/150
提交
取消