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;
        
    }
};
相关推荐
another heaven5 分钟前
【C/C++ Ranges 是零开销抽象吗?拆开管道、惰性求值和编译期膨胀】
c语言·开发语言·c++
文丑颜不良啊1 小时前
LeetCode2821~2840题目解析
java·leetcode
apcipot_rain2 小时前
C++转Java日记(10)
java·开发语言
简 洁 冬冬2 小时前
泛型方法写法全面辨析:从「能编译」到「能跑」到「能用」
java·泛型
YLCHUP3 小时前
【思维&图论建模】题解:债权(debt)_图论_建模_思路转化_思维题目_C++算法竞赛
c++·笔记·算法·数学建模·贪心算法·深度优先·图论
LGL6030A3 小时前
Java学习历程31——初识Spring Boot
java·spring boot·学习
xiaoye-duck3 小时前
《C++ 项目:手写大模型接入 SDK》会话模块整合:内存 SessionManager 与 DataManager 持久化联动
开发语言·数据库·c++·语言模型
思麟呀3 小时前
背包DP(01背包+完全背包)
c++·算法
旖旎夜光5 小时前
【C++ 基础入门】C++11 新特性(中):右值引用、移动语义与完美转发
开发语言·c++·笔记·学习
Lansonli5 小时前
大数据Spark(八十八):Spark任务资源之Standalone集群测试
java·服务器·spark