leetcode 32. Longest Valid Parentheses

括号匹配当然是用栈了,这里用一个Int栈,因为既要存储数字,又要存储括号。注意这里的数字是临时的括号匹配数量,而'('=40,是个偶数,所以随便用一个奇数代替左括号。

算法就是从左向右扫描,遇到左括号就入栈,遇到右括号有三种情况:

1.栈顶是左括号,那么用2取代那个左括号,这时如果栈顶下边是个数字,就要加上这个二;

2.栈顶是数字,数字下边是个左括号,也就是"(数字)"的情况,用数字+2代替左括号,栈顶下降。再向前检查看是不是数字,是数字就合并。

3.栈顶是数字,数字下边是(。直接将)入栈。



int longestValidParentheses(char* s) {
    int maxRet,head,lenS,i;
    int *temp;
    lenS=strlen(s);
    temp=(int *)malloc(sizeof(int)*lenS);
    head=0;//栈顶
    maxRet=0;

    for(i=0;i0&&temp[head-1]==43)
            {
                temp[head-1]=2;
                if(head>1&&temp[head-2]!=43&&temp[head-2]!=')')//'数字''数字'的情况
                {
                    temp[head-2]=temp[head-2]+2;
                    head--;
                }

            }
            else if(head>1&&temp[head-1]!=43&&temp[head-1]!=')'&&temp[head-2]==43)   //"('数字')"的情况
            {
                temp[head-2]=temp[head-1]+2;
                head--;
                if(head>1&&temp[head-1]!=43&&temp[head-1]!=')'&&temp[head-2]!=43&&temp[head-2]!=')')
                {
                    temp[head-2]=temp[head-1]+temp[head-2];
                    head--;
                }
            }
            else
            {
                temp[head++]=')';
            }


        }
    }
    for(i=0;imaxRet&&temp[i]!=43&&temp[i]!=')')
            maxRet=temp[i];
    return maxRet;
}




你可能感兴趣的:(leetcode)