题目介绍
给你一个只包含 '('
和 ')'
的字符串,找出最长有效(格式正确且连续)括号子串的长度。
题目分析
给定一串有效的括号字符串,找出最长有效括号。分析时以'(' 为1,')'为-1。
其中有效括号字符串的特点为:有效括号内和为0;
字符串的特点为:从左至右加和小于0出现断点,从右至左加和大于0出现断点,两次循环判断断点后,剩下的就是被断点隔开的有效括号,其中最长的连续括号即所求。
思路
1.创建一个struct ITEM包含count和validNum,记录每一个分段。这里用双线链表实现。
2.创建主代码,对字符串进行循环,主要处理分段、记录、合并、统计工作。
3.分段:设置标识码SetItem=0,遇见')'时,将SetItem设置为1,遇见'('且SetItem=1时创建struct 4.ITEM并重置SetItem为0;
5.记录、合并:遇见'('时,count递增,单独编写一个subtraction()函数处理循环中出现')'的情况。
小于0,递减count。
等于0,对上一个片段调用subtraction()函数,直到上一个片段count也无法递减时,则返回1表示当前片段count需从0递减到-1,出现断点。
大于0,递减count,递增validNum,当递减后的count=0时,与前一个片段合并。
合并:循环ITEM链表,找出最大validNum*2就是最后所找的最长有效括号序列。
代码
int longestValidParentheses(char * s){
int count=0;
int sum=0;
int validnum=0;
int max=0;
while(*s!='\0')
{
count++;
if (*s == '(')
sum++;
else
sum--;
if (sum < 0)
{
sum = 0;
*s = 'b';
}
s++;
}
s--;
for(sum = 0;count > 0;count--, s--)
{
if (*s=='b')
{
max=(max > validnum)?max:validnum;
validnum = 0;
continue;
}
else if (*s == '(')
sum++;
else if (*s == ')')
sum--;
if (sum > 0)
{
sum = 0;
*s = 'b';
max = (max > validnum) ? max : validnum;
validnum = 0;
}
else
validnum++;
}
max = (max> validnum) ? max : validnum;
return max;
}