【LeetCode】32. Longest Valid Parentheses (2 solutions)

Longest Valid Parentheses

Given a string containing just the characters '(' and ')', find the length of the longest valid (well-formed) parentheses substring.

For "(()", the longest valid parentheses substring is "()", which has length = 2.

Another example is ")()())", where the longest valid parentheses substring is "()()", which has length = 4.

 

括号匹配的常规思路就是用进出栈。

但是这题的关键在于“连续匹配”,因此计算“连续匹配”长度时,本质就是求不匹配的括号之间最大长度。

也就是求进栈但未出栈的括号下标之间的最大差值。

注意边界:

(1)第一个留在栈中的括号之前的连续匹配长度。

(2)最后一个留在栈中的括号之后的连续匹配长度。

 

解法一:栈中记录未匹配括号的下标。在全部扫描s之后,将未匹配的括号逐个出栈进行计算。

class Solution {
public:
    int longestValidParentheses(string s) {
        int ret = 0;
        stack<int> stk;   //store the indexes of unmatched parentheses
        for(int i = 0; i < s.size(); i ++)
        {
            if(s[i] == '(')
            //unmatch
                stk.push(i);
            else
            {//s[i] == ')'
                if(!stk.empty() && s[stk.top()] == '(')
                //match
                    stk.pop();
                else
                //unmatch
                    stk.push(i);
            }
        }
        if(stk.empty())
        //all match
            ret = s.size();
        else
        {//check every unmatched pair of parentheses
            int start;
            int end = s.size()-1;
            while(!stk.empty())
            {
                start = stk.top();
                stk.pop();
                ret = max(ret, end-start);
                end = start-1;
            }
            //from begin to the first unmatched parenthese
            ret = max(ret, end+1);
        }
        return ret;
    }
};

 

解法二:栈中记录括号及下标。在每次进站时计算与上个未匹配括号的距离。

struct Par
{
    char c;
    int ind;
    Par(char newc, int newind): c(newc), ind(newind) {}
};

class Solution {
public:
    int longestValidParentheses(string s) {
        if(s == "")
            return 0;
            
        stack<Par> stk;
        int ret = 0;
        int ind;
        for(int i = 0; i < s.size(); i ++)
        {
            if(s[i] == '(')
            {
                if(!stk.empty())
                // distance between new unmatched parenthese and last unmatched parenthese
                    ret = max(ret, i-stk.top().ind-1);
                else
                // distance between string begin and first unmatched parenthese
                    ret = max(ret, i);
                Par p(s[i], i);
                stk.push(p);
            }    
            else if(s[i] == ')')
            {
                if(!stk.empty())
                {
                     if(stk.top().c == '(')
                        stk.pop();
                    else
                    {// distance between new unmatched parenthese and last unmatched parenthese
                        ret = max(ret, i-stk.top().ind-1);
                        Par p(s[i], i);
                        stk.push(p);
                    }
                }
                else
                {// distance between string begin and first unmatched parenthese
                    ret = max(ret, i);
                    Par p(s[i], i);
                    stk.push(p);
                }  
            }
        }
        if(stk.empty())
        {//all matched
            return s.size();
        }
        // distance between string end and last unmatched parenthese
        ret = max(ret, (int)s.size()-stk.top().ind-1);
        
        return ret;
    }
};

posted @ 2014-12-18 10:39  陆草纯  阅读(319)  评论(0编辑  收藏  举报