leetcode 热题100(32. 最长有效括号)栈 c++

链接:32. 最长有效括号 - 力扣(LeetCode)

给你一个只包含 '(' 和 ')' 的字符串,找出最长有效(格式正确且连续)括号

子串

的长度。

示例 1:

复制代码
输入:s = "(()"
输出:2
解释:最长有效括号子串是 "()"

示例 2:

复制代码
输入:s = ")()())"
输出:4
解释:最长有效括号子串是 "()()"

示例 3:

复制代码
输入:s = ""
输出:0

提示:

  • 0 <= s.length <= 3 * 104
  • s[i] 为 '(' 或 ')'

思路

首先看到是求有效括号,很容易就想到用栈来写了,栈用来记录一下每个'('出现的位置,当枚举到')'的时候就判断一下栈中是否存在'(',如果存在的话说明可以构成一对有效的括号,然后我们就在当前')'的位置下标记一下当前有多少个连续的有效括号数:dpi=dp[i-st.top()-1}+2。

i-st.top()-1是上个')'的位置,2是当前位置匹配成功+2。具体逻辑看代码注释

代码

cpp 复制代码
class Solution {
public:
    int longestValidParentheses(string s) {
        int n = s.size();
        vector<int> dp(n+1,0);
        stack<int> st;
        int tmp = 0,res=0;
        s = " "+s;
        for(int i=1;i<=n;i++){
            if(s[i]=='('){
                st.push(i);
                tmp=0;  //'('新位置表示重新开始匹配,赋值为0
            }else{
                if(st.size()==0) tmp=0;//')'数量多了一个,前面无法与之匹配,所以最长的已经定下来了,tmp=0,下一轮重新枚举
                else{
                    tmp+=dp[st.top()-1]+2;//加上一个')'进行统计最大值
                    st.pop();
                    dp[i]=tmp;
                }
            }
            res = max(tmp,res);
        }
        return res;
        
    }
};
相关推荐
萧瑟余晖1 分钟前
Spring Integration企业集成概览详解
java·后端·spring
这个昵称不容易8 分钟前
SpringBoot 墙绘交易平台毕设:128个文件154个接口含论文,带运行截图
java·springboot·毕设
東隅已逝,桑榆非晚10 分钟前
红黑树:从概念到实现
数据结构·c++·笔记·学习
SimonKing13 分钟前
告别纸质合同,使用DocuSeal搭建私有电子签平台
java·后端·程序员
七夜zippoe17 分钟前
Spring AI 函数调用:让 Java 方法变成 Agent 的工具(实战全流程)
java·人工智能·spring·ai·agent·函数调用
萧瑟余晖23 分钟前
Spring Batch 高级特性与实践详解
java·spring·batch
她说..24 分钟前
常见设计模式-观察者模式
java·spring boot·spring·观察者模式·设计模式
vipxieliang28 分钟前
Actuator 与 Micrometer:生产级监控体系搭建
java·spring boot
Seven9733 分钟前
Java已死?社招第一次跳槽:Boss沟通505次,6周拿下8个offer
java
艾莉丝努力练剑1 小时前
【AI大模型接入SDK】ChatServer接口测试
网络·c++·人工智能·学习·ai·大模型·sdk