【打卡】牛客网:BM77 最长的括号子串

文章介绍了一种基于栈的算法来计算给定字符串中最长的有效括号序列,涉及递归、栈的使用以及动态规划思想的应用。
摘要由CSDN通过智能技术生成

之前字符串的题有:

BM44 有效括号序列

        用栈的方法

BM60 括号生成

        用递归的方法

模板的:

模板没有用到动态规划,更像一种循环遍历。代码中的细节处理很巧妙。

栈专门用于储存左括号的位置。

比如例子"s=(()()"

s[2]把栈中[0,1]的1消掉,s[4]把栈中[0,3]的3消掉,栈中多余的左括号中最top是0,4-0=4即为所求。

我的误区,以为s[4]把[0,1]的1消掉。所以先i-st.top()+1=4,再st.pop()。其实是不对的。

在正确连续括号后,左右括号太多,不需要管。

在正确连续括号前(包括两个正确连续括号中间):

  • 左括号太多,有st.pop()+max(res,i-st.top())
  • 右括号太多,有start记录+max(res,i-start) 
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param s string字符串 
     * @return int整型
     */
    int longestValidParentheses(string s) {
        // write code here
        int res = 0;
        int start = -1;
        stack<int> st;
        for(int i = 0; i < s.length(); i++){
            if(s[i] == '(')
                st.push(i);

            else{
                //多余的右括号,中断了连续括号的可能
                if(st.empty()){
                    start = i;
                }

                else{
                    st.pop();
                    if(st.empty())
                        res = max(res, i-start);
                    else
                        res = max(res, i-st.top()); //巧妙
                }
            }
        }
        return res;
        
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值