Longest Valid Parentheses

class Solution {
public:
    int max(int x,int y)
    {
        if(x>=y)
            return x;
        else
            return y;
    }
    
    int longestValidParentheses(string s) {
        stack<int> st;
        int start=-1;
        int length=0;
        for(int i=0;i<s.size();i++)
        {
            if(s[i]=='(')
                st.push(i);
            else
            {
                if(st.size()==0)
                    start=i;
                else
                {
                    st.pop();
                    if(st.size()==0)
                        length=max(length,i-start);
                    else
                        length=max(length,i-st.top());
                }
            }
        }
        return length;
    }
};

因为要算匹配长度,所以要记录起始的位置。思路上要分三种情况吧,一种是完全匹配,一种是未匹配的是‘)’,一种是未匹配的是‘(’。如果发现没有左括号可以和右括号匹配,那么只要把右括号位置设置为start,重新开始新一轮的寻找就可以了;如果没有右括号可以和左括号匹配,则要用当前位置减去堆栈栈顶的左括号位置,查看是否有更长的括号匹配长度。

整体思路如下:

1. 记起始匹配位置start=-1;最大匹配长度length=0;(start设置为-1是为了便于计算长度)

2. 考察第i位字符c:

  1)如果c为'(',入栈   (由于要计算长度,所以入栈的应该是左括号的位置)

      2)如果c为')',则要进行括号匹配

           a. 如果此时栈空,则没有可以匹配的左括号,start=i,重新开始搜索

           b. 栈不空表示有可以匹配的左括号,左括号出栈,考察出栈后的情况:

               * 如果栈为空,i-start即为当前找到的匹配长度,检查i-start是否为更大的length,是否要更新length;

               * 如果栈不为空,则当前栈顶元素是还未匹配的'(',检查i-stack.top()是否比length更大,是否要更新length;

posted on 2016-04-10 11:28  summerkiki  阅读(147)  评论(0编辑  收藏  举报