LeetCode 32. Longest Valid Parentheses

Posted AlvinZH

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 32. Longest Valid Parentheses相关的知识,希望对你有一定的参考价值。

问题链接

LeetCode 32. Longest Valid Parentheses

题目解析

给出只包含左右括号的字符串,返回最长的括号匹配字符串长度。

解题思路

括号匹配问题一般借助 ,便于理解。定义 \\(start\\) 记录合法字符串的起始位置,遍历字符串:

  • 当遇到左括号,则把其索引压入栈中;
  • 当遇到右括号,判断栈是否为空,若为空,说明当前右括号无法匹配,则需要更新合法开始位置为i+1,不为空,说明可以匹配,可以匹配的情况下,先弹出栈顶元素,这时候再次判断栈是否为空,若为空,则更新结果为和 \\((i-start+1)\\) 中的较大值,否则更新结果为和 \\((i-LVP.top()+1)\\) 的最大值。

参考代码

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

动态规划解法

本题也可以使用动态规划求解,参考:[LeetCode] Longest Valid Parentheses。个人认为该博主讲的不是很清楚,这里再简单说两句。

定义DP[i]为以 \\(s[i-1]\\) 结尾的LVP。

  • 对于 s[i-1]==\'(\',则 DP[i]=0;
  • 对于 s[i-1]==\')\',我们找到以s[i-2]结尾的LVP的开始位置.

举个例子:对于字符串···( xxxx )···,其中xxxx代表以s[i-2]结尾的LVP,要找的即是例子中左括号的索引,怎么求呢?很简单,\\(left = i-2-DP[i-1]\\)

请注意DP数组的定义:以 \\(s[i-1]\\) 结尾的LVP。需要判断一些特殊情况,只有在 \\(s[i-1]==\')\' && left >= 0 && s[left] == \'(\'\\) 时,才可以更新 \\(DP[i] = DP[i-1]+2+DP[left]\\)

参考代码如下:

class Solution {
public:
    int longestValidParentheses(string s) {
        vector<int> DP(s.length()+1, 0);
        int maxLen = 0;
        for(int i=1; i <= s.length(); i++) {
            int left = i-2-DP[i-1];
            if(s[i-1]==\'(\' || left<0 || s[left]==\')\') 
                DP[i] = 0;
            else {
                DP[i] = DP[i-1]+2+DP[left];
                maxLen = max(maxLen, DP[i]);
            }
        }
        return maxLen;
    }
};

官方解法

官方题解:32. Longest Valid Parentheses。其中提到了四种方法,本文中讲到的是第二第三种方法,另外最后还有一种空间O(1)的方法,比较巧妙。

相似题目

LeetCode 20. Valid Parentheses

LeetCode 22. Generate Parentheses


LeetCode All in One题解汇总(持续更新中...)

本文版权归作者AlvinZH和博客园所有,欢迎转载和商用,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.


以上是关于LeetCode 32. Longest Valid Parentheses的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 32. Longest Valid Parentheses

LeetCode 32. Longest Valid Parentheses

LeetCode 32. Longest Valid Parentheses

[leetcode-32-Longest Valid Parentheses]

leetcode 32. Longest Valid Parentheses

Leetcode 32: Longest Valid Parentheses