32. Longest Valid Parentheses

题目

Given a string containing just the characters '(' and ')', find the length of the longest valid (well-formed) parentheses substring.

For "(()", the longest valid parentheses substring is "()", which has length = 2.

Another example is ")()())", where the longest valid parentheses substring is "()()", which has length = 4.

分析

寻找一个只有'('和')'的字符串中有效的匹配括号对的最长长度,用一个栈记录未匹配的'('或')'的下标,当字符串中出现一个能匹配的括号对时,弹出栈顶下标,此时的栈顶下标是最后一个未匹配的字符下标,用i-st.top()算出此时连续匹配的最长长度,并跟maxL比较得到最长的长度。

例如,对")()())",当第一个括号对匹配时,st.top()=0,i=2,此时maxL=2,当第二个括号对匹配时,st.top()=0,i=4,此时maxL=4;对"(()(()",当第一个括号对匹配时,st.top()=0,i=2,此时maxL=2,当第二个括号对匹配时,st.top()=3,i=5,此时maxL=2。可以看出,由于连续匹配的括号对下标弹栈,所以i-st.top()可以得到当前所在的匹配括号长度,如果中途该匹配串中断了,则再次计算时,st.top()记录的是新的匹配括号串前一个元素的下标,仍可作为长度来计算,并实时更新maxL值。

class Solution {
public:
    int longestValidParentheses(string s) {
        stack<int> st;//用栈记录下字符串中未匹配成对的'('和')'出现的位置
        st.push(-1);
        int size=s.size();
        int maxL=0;//记录最长的匹配串长度
        for(int i=0;i<size;++i){
            int t=st.top();
            if(t!=-1&&s[t]=='('&&s[i]==')'){//如果当前字符与栈顶字符匹配成一对,则将栈顶元素弹出,并计算此时已匹配的最长长度
                st.pop();
                maxL=max(maxL,i-st.top());
            }
            else
                st.push(i);//否则将当前字符的下标压入栈
        }
        return maxL;
    }
};


基于bert实现关系三元组抽取python源码+数据集+项目说明.zip基于bert实现关系三元组抽取python源码+数据集+项目说明.zip基于bert实现关系三元组抽取python源码+数据集+项目说明.zip基于bert实现关系三元组抽取python源码+数据集+项目说明.zip基于bert实现关系三元组抽取python源码+数据集+项目说明.zip 个人大四的毕业设计、课程设计、作业、经导师指导并认可通过的高分设计项目,评审平均分达96.5分。主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业。 [资源说明] 不懂运行,下载完可以私聊问,可远程教学 该资源内项目源码是个人的毕设或者课设、作业,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96.5分,放心下载使用! 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),供学习参考。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值