当前位置:首页 > 洛谷 > 洛谷P10472题解:利用栈求解最长有效括号

洛谷P10472题解:利用栈求解最长有效括号

3个月前 (06-22)

洛谷P10472题解:利用栈求解最长有效括号  栈结构应用 动态规划 第1张

一、题目解读

洛谷P10472题要求计算给定字符串中最长有效括号的长度。有效括号指括号成对匹配(如"()[]{}"),子串需连续且内部嵌套正确。题目核心在于判断括号匹配的连续性,并找出最长合法子串。该问题常见于算法练习,考验对栈结构的理解和字符串处理能力。

二、解题思路

采用(Stack)结构解决该问题。核心思想:遍历字符串,左括号入栈,右括号尝试与栈顶匹配。若匹配成功则弹出栈顶,更新最长长度;若不匹配或栈空,则将当前位置入栈作为新“分割点”。通过栈的压入与弹出动态维护匹配区间,最终得到最长有效子串长度。

三、解题步骤

1. 初始化:创建栈并压入-1作为初始边界(避免空栈时的计算问题)。

2. 遍历字符串:

    若为左括号('('、'['、'{'),直接入栈记录位置;

    若为右括号,分情况处理:

        栈顶为对应左括号(如栈顶为'('且当前为')'),弹出栈顶并计算当前区间长度(i - 栈顶位置),更新max_len;

        不匹配或栈空时,将当前位置i入栈(标记无效区间的分割点)。

3. 结果返回:遍历结束后,max_len即为最长有效括号长度。

四、代码与注释

#include <iostream>
#include <stack>
#include <vector>
using namespace std;

int longestValidParentheses(string s) {
    stack<int> st;  
    st.push(-1); // 初始边界,避免空栈时i - st.top()出错  
    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的设计避免了空栈时索引计算的异常,提升了代码鲁棒性。时间复杂度O(n),空间复杂度O(n)(栈最大存储n个位置),适用于大多数场景。此外,可拓展至其他括号相关匹配问题,为算法学习提供典型范例。


原创内容 转载请注明出处

分享给朋友:

相关文章

IOI 1994 洛谷1216:如何用O(1)空间解决数字三角形问题?附代码实现

IOI 1994 洛谷1216:如何用O(1)空间解决数字三角形问题?附代码实现

题目重解:数字三角形是一个经典的动态规划问题,给定一个由数字组成的三角形结构,从顶部出发,每次可以移动到下方相邻的数字,最终到达底部。我们需要找到一条路径,使得路径上经过的数字总和最大。这个问题可以很...

GESP2023年六级真题解析:动态规划解决小杨买饮料问题(洛谷3873)

GESP2023年六级真题解析:动态规划解决小杨买饮料问题(洛谷3873)

一、题目解读小杨买饮料是GESP 2023年六级认证考试中的一道经典动态规划题目,考察学生对背包问题的理解和应用能力。题目描述小杨需要购买n种饮料,每种饮料有特定的体积w和价格v,他要在不超过容量l的...

CSP-J方格取数题解|动态规划解法|洛谷P7074代码解析

CSP-J方格取数题解|动态规划解法|洛谷P7074代码解析

一、题目解读题目要求在一个n×m的网格中,从左上角到右下角选择一条路径,路径上的数字可重复取用,求取数之和的最大值。路径限制为仅能向右或向下移动。需注意路径的灵活性与重复取数的可能性,传统单向动态规划...

CSP-J 2019公交换乘题解析:基于队列优化的动态规划代码详解

CSP-J 2019公交换乘题解析:基于队列优化的动态规划代码详解

一、题目解读CSP-J 2019年的“公交换乘”题目(洛谷P5661)要求模拟地铁与公交交替出行的费用计算。题目核心在于地铁消费会产生优惠券,而公交可在45分钟内使用优惠券抵扣车费。需要处理n条出行记...

【蓝桥杯2015省赛解析】生命之树:树形DP解题全攻略(洛谷P8625代码详解)

【蓝桥杯2015省赛解析】生命之树:树形DP解题全攻略(洛谷P8625代码详解)

一、题目解读    “生命之树”是一道经典的树形结构问题,要求计算一棵带权树中,以某个节点为根的最大子树权值和。题目输入为n个节点及边信息,每个节点有权值wi,...

牛客25461题解析:花园喷泉距离优化算法(动态规划+后缀数组解法)

牛客25461题解析:花园喷泉距离优化算法(动态规划+后缀数组解法)

一、题目解读牛客25461题要求计算一个花园中n朵花到两个喷泉的最小距离平方和。用户需输入喷泉坐标(x1,y1)和(x2,y2),以及n朵花的坐标(x,y),通过合理分配每朵花到两个喷泉的距离,使总距...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。