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

贾蔷
• 阅读 8

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

一、问题描述

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

二、算法核心思想

  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,记录最大有效长度
  2. 遍历处理
    • 遇到左括号:压入栈中
    • 遇到右括号:检查栈顶是否匹配
    • 匹配成功:弹出栈顶,计算当前有效长度
    • 匹配失败:压入当前位置作为新边界
  3. 结果计算
    • 每次成功匹配后,i - st.top()即为当前有效长度
    • 使用max函数保持最大长度

五、常见误区与调试技巧

  1. 忘记初始化虚拟边界
  2. 未正确处理不匹配情况
  3. 长度计算错误
  4. 栈空判断遗漏

六、扩展思考

  1. 如何修改算法只处理小括号?
  2. 如果不使用栈,能否用动态规划解决?
  3. 如何统计所有有效括号子串而不仅是最大长度?
  4. 如何扩展到多行文本的括号匹配

来源:信奥自学之路

点赞
收藏
评论区
推荐文章
半臻 半臻
4年前
Python基础11——正则表达式
19正则表达式19.1正则基础正则表达式:字符串处理工具应用场景1.html查询2.验证字符串是否符合规则re模块match方法python通过正则表达式对字符串进行匹配importre使用match方法进行匹配操作re.match()从字符串的开始位置进行匹配,匹配成功,返回match对象。匹配失败,返回Noneresre
Stella981 Stella981
3年前
Python初识day2
本节内容:1.列表、元组操作2.字符串操作3.字典操作4.集合操作5.文件操作一、列表、元组操作1.列表:列表是我们使用频率最高的数据类型之一,由一个中括号\\括起来,里面的值可以是任何类型(也可以是一个列表)。  列
Wesley13 Wesley13
3年前
MySQL 数据类型
在MySQL中,有三种主要的类型:文本、数字和日期/时间类型。Text类型:数据类型描述备注CHAR(size)保存固定长度的字符串(可包含字母、数字以及特殊字符)。在括号中指定字符串的长度。最多255个字符。VARCHAR(size)保存可变长度的字符串(可包含字母、数字以及特殊字符)。在括号中指定字符串
Wesley13 Wesley13
3年前
Java解决括号匹配算法问题
有效字符串需满足:左括号必须用相同类型的右括号闭合。包括:“()”,“\\”,“{}”。左括号必须以正确的顺序闭合。注意空字符串可被认为是有效字符串。思路:在这里我们使用栈来实现。遍历字符串时判断:如果是左括号,那么我们将其入栈;如果为右括号,我们先判断栈是否为空(有可能字符串刚开始就是一个右括号呢),为空的话直接返回false,不为空
Stella981 Stella981
3年前
Leetcode 424.替换后的最长重复字符
替换后的最长重复字符给你一个仅由大写英文字母组成的字符串,你可以将任意位置上的字符替换成另外的字符,总共可最多替换 _k_次。在执行上述操作后,找到包含重复字母的最长子串的长度。注意:字符串长度和_k_不会超过 104。示例1:输入:s"ABAB",k2输
深度学习 深度学习
2星期前
牛客网235698题:用滑动窗口寻找最多包含两种字符的最长子串
一、什么是?是一种用于处理/子区间问题的技术。它通过维护一个窗口(通常是子数组或子字符串),在遍历过程中动态调整窗口的边界,从而高效地解决问题。二、算法核心思想1.‌初始化窗口‌:通常从数组/字符串的起始位置开始1.‌扩展窗口‌:移动右边界,扩大窗口范围1
深度学习 深度学习
1个月前
2024蓝桥杯省赛B组前缀总分(洛谷P12124)解题思路与代码详解
一、题目解读2024年蓝桥杯省B组题目“前缀总分”(对应洛谷P12124)要求计算给定字符串集合中,所有前缀的最长公共前缀(LCP)的总分,并找出通过移动字符位置后可能获得的最大总分。题目考察字符串处理与动态规划能力,需高效计算LCP并优化得分策略。二、解
深度学习 深度学习
1个月前
洛谷P2034题解:动态规划+单调队列优化求解最大K段子段和问题
一、题目解读洛谷P2034题目要求给定一个长度为n的整数数组,将其分成不超过k段,求各段和的最大值。该问题属于经典动态规划问题的扩展,需结合优化技巧高效求解。二、解题思路采用动态规划单调队列优化的策略。核心思想是定义状态dp
深度学习 深度学习
2星期前
动态规划巧解字符串压缩优化问题 - 力扣1531题深度解析
一、问题理解行程长度编码(RunLengthEncoding)是一种简单有效的压缩方法。题目要求我们在删除最多k个字符后,使压缩后的字符串长度最短。二、解题思路1.状态定义:dp:情况1:删除当前字符,直接继承dp1.练习简单DP问题1.逐步过渡到这类复杂
深度学习 深度学习
2星期前
动态规划巧解字符串压缩优化问题 - 力扣1531题深度解析
一、问题理解行程长度编码(RunLengthEncoding)是一种简单有效的压缩方法。题目要求我们在删除最多k个字符后,使压缩后的字符串长度最短。二、解题思路1.状态定义:dp:情况1:删除当前字符,直接继承dp1.练习简单DP问题1.逐步过渡到这类复杂