LeetCode 32

LeetCode 32_第1张图片

          这个题目比较难想到,我刚刚开始以为使用栈就可以解决问题,因为数据结构的栈可以用来判断符号的匹配,相信我们也都写过相关的代码吧。但是这个题并不是简单的匹配而已,它要求的是最长的匹配符号的长度,而且字符串中只有 '(' 和 ')'两种,所以我们也比较容易判断是否匹配,不过要达到题目的要求还有一定的难度。

      既然以前使用栈的时候可以判断符号的匹配问题,那么这个题的思路也跟栈离不开,但是需要对栈做一定的变形,具体思路如下:

     使用栈来保存字符串的下标,整个题目中入栈和出栈的也都是字符串的下标,因为我们要算长度。我们可以举几个例子来说明该文题的求解方法。

(1) "()()() " 这中情况是比较好判断的,比较直观,随意就能解答出来,因为全部匹配,所以长度为 6 。

(2) " )()(() " 这种情况就比较复杂,因为中间多余了一个‘(’,必然导致匹配的长度不连续,但是判断到这个‘(’的时候我们也不能轻易下结论,因为我们不能保证后面的序列中是否还有‘)’与之匹配,那么我们怎么样来解答问题呢?

       我们可以利用有些下标来解题,就拿“)()(()”来说吧,首先在栈为空的时候,我们遇到 '(' 或 ')' 都压入栈,虽然开始的第一个‘)’一定不匹配,但是我们可以让它发挥它的作用,它虽然不能匹配,但是它是分隔符,我们可以利用它的下标来分割最长的匹配部分。我发现这个题不是很好说明,所以画了图分析,大家可以看图结合代码看看,应该很快可以理解了。

LeetCode 32_第2张图片

代码如下:

class Solution
{
public:
    int longestValidParentheses(string s)
    {
        int slen = s.size();
        stack S;
        int maxlen = 0;
        int count = 0;
        for(int i=0; i < slen; ++i)
        {
            if(s[i]=='(')
            {// ‘(’ 压入下标 
                S.push(i);
            }
            else
            {
                if( !S.empty() )
                {//栈不空,则判断是否连续匹配
                    count = S.top(); //栈顶下标
                    if( s[count] == ')')
                    {//这是不合法的位置,不用处理
                        S.push(i);
                    }
                    else
                    {
                        S.pop();
                        if(S.empty())
                        {//全部匹配了栈会空
                            maxlen = i+1;
                        }
                        else
                        {//可能存在不合法的位置,用该位置来计算最长长度
                            count = S.top();
                            if(i-count > maxlen)
                            {
                                maxlen = i-count;
                            }
                        }
                    }
                }
                else
                {//这个位置说明它是不合法的位置,可以发挥一定的作用,用来计算匹配到的最长长度
                    S.push(i);
                }
            }
        }
        return maxlen;
    }
};

相应的测试结果如下:

LeetCode 32_第3张图片

你可能感兴趣的:(笔试题,our's,LeetCode)