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;
}
以上过程建议手动模拟一遍。有助于理解。