最长有效括号c语言

题目介绍

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

题目分析
给定一串有效的括号字符串,找出最长有效括号。分析时以'(' 为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;
}

你可能感兴趣的:(leetcode,c语言)