Leetcode 第32题 最长有效括号

Leetcode 第32题 最长有效括号

题目描述

给你一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长有效(格式正确且连续)括号子串的长度。
在这里插入图片描述

解题思路

我选择用标记法。
记字符串的长度为len 。 设置一个标记数组index[len] 。index[i]=1—>‘)’ index[i]=2 —>‘(" .
在一趟循环里,如果遇到’("记 index[i]=2,
遇到’)'记 index[i]=1,然后在判断从 j = i-1到0倒着对index数组做判断
index[j]==1 立即break,
index[j]==2 表明找到了一个没有被标记过的与index[i]匹配的(括号。此时把index[i] 和 index[j] 都设置为0。然后break、
一趟循环结束,index数组里只有0,1,2三种类型的值,我们只需要统计连续的0有几个即表示最长有效括号子串的长度。

解题代码

int longestValidParentheses(char * s){
    if(*s=='\0') return 0;
    int i=0;
    int len=strlen(s);
    int index[len];
    for(;i<len;i++){
        if(s[i]=='('){
            index[i]=2;
        }else if(s[i]==')'){
            index[i]=1;
            if(i==0) continue;//如果串开头就是)那不用管它。
            for(int j=i-1;j>=0;j--){
                if(index[j]==1) break;
                if(index[j]==2){
                    index[j]=0;
                    index[i]=0;
                    break;
                }
            }
    }

    }
    int res=0,m=0,n=-1;
    for(int m=0;m<len;m++){
    //这里用来找最长的连续0子段。利用了滑动窗口的思路。n表示窗口左标,m是窗口右标。
        if(index[m]==0) {res = fmax(res,m-n);}
        else{
            n=m;//在这种中断的地方,当前最长的res是不变的。          
        }
    }
    return res;
}

以上过程建议手动模拟一遍。有助于理解。

结果如下

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值