LeetCode(32)--Longest Valid Parentheses

来源:互联网 发布:单片机什么是硬件,软件 编辑:程序博客网 时间:2024/06/05 14:54

这道题可以借用前面的括号匹配的思路,使用栈来解决。这次,我们压入栈的不再是‘(’或者‘)’,而是它的索引值。
大致思路如下:
遍历字符串s,当当前字符是‘(’,则压入栈中;若是‘)’,则判断栈顶是否为‘(’,若是则将栈顶的‘(’弹出,若不是则压入栈中。最后栈中剩下的数字就是不能匹配的‘(’和‘)’的索引值。
例如:”)()())()()(”
最后栈中剩余值为“0 5 10”
说明0~5之间的4个字符成功匹配,5~10之间的4个自付成功匹配。
由此可见,计算两个索引值之间的间距即为匹配成功的字符串长度,我们可以计算出所有的长度,并返回最长的那个,即为最终结果。

代码实现如下:

class Solution {public:    int longestValidParentheses(string s) {        if (s.empty()||s.size()==1)return 0;        vector<int> res;        for (int i = 0; i < s.size(); i++)        {            if (s[i] == '('){                res.push_back(i);                cout << res.back() << endl;            }            else            {                if (res.empty())                {                    res.push_back(i);                }                else{                    if (s[res.back()] == '(')                    {                        res.pop_back();                    }                    else                    {                        res.push_back(i);                    }                }            }        }        if (res.empty())return s.size();        int result=res[0];        for (int i = 1; i < res.size(); i++)        {             //计算每两个索引值之间的间隔            int temp = res[i] - res[i - 1]-1;            //返回最大的值            if (temp>result)result = temp;        }        //计算最后一个索引值与字符串结尾的间隔        int temp = s.size() -1- res.back();        if (temp>result&&temp != 1)result = temp;        return result;    }};