力扣T32. 最长有效括号 C

来源:力扣

题目描述:

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

可以把一个能匹配的左右括号设定为价值 1,那么连续多个匹配的括号相当于有多个 1 的序列,于是问题就转化为,在 0,1 串中求最长不为 0 的子序列的长度问题。本质上还是以空间换取时间。

时间复杂度 O(n)

空间复杂度 O(n)

举例如下:

给定字符串: "()((()))))"

转化为 0-1 串,"111111110",可求得最长不为 0 的子序列的长度为 8.

int longestValidParentheses(char * s){
    int l=strlen(s),ans=0,len=0,t=0;
    if(l==0)return ans;//如果字符串长度为0,返回0

    char ss[30010];//作为字符栈,进行括号匹配
    int num[30010]={0};//储存0-1串
    int nss[30010]={0};//记录下标
    for(int i=0;i<l;++i)
    {
        if(s[i]=='(')ss[t]=s[i],nss[t]=i,t++;//左括号进栈
        else if(s[i]==')')
        {
            if(t>0&&ss[t-1]=='(')num[nss[t-1]]=num[i]=1,t--;
        }
    }
    for(int i=0;i<l;++i)
    {
        if(num[i]==1)//当前是出于能匹配的位置,看一下前面是否匹配
        {
            if(i-1>=0&&num[i-1]==1)len+=1;
            else ans=(ans>len)?ans:len,len=1;
        }
    }
    ans=(ans>len)?ans:len;
    return ans;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值