来源:力扣
题目描述:
给你一个只包含 '('
和 ')'
的字符串,找出最长有效(格式正确且连续)括号子串的长度。
可以把一个能匹配的左右括号设定为价值 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;
}