LeetCode 32

https://leetcode.cn/problems/longest-valid-parentheses/description/

难度:困难

本题是一道一维 DP 的题目。f[i] 表示以 i 结尾的最长有效括号的长度。由于有效括号只会以 ‘)’ 结尾,所以只在当前字符为 ‘)’ 时的状态转移。

当前一个字符为 ‘(’ 时,转移到 f[i] = f[i - 2] + 2。

当第 i - f[i - 1] - 1 个字符为 ‘(’ 时,将原本不连续的两段长度合并,即转移到 f[i] = f[i - 1] + f[i - f[i - 1] - 2] + 2。

时间复杂度: O(n),其中 n 为字符串的长度。我们只需遍历整个字符串一次,即可将 dp 数组求出来。

空间复杂度: O(n)。我们需要一个大小为 n 的 dp 数组。

class Solution {
public:
    int longestValidParentheses(string s) {
        int n = s.size();
        if (n == 0) {
            return 0;
        }
        vector<int> f(n, 0);
        for (int i = 1; i < n; i++) {
            if (s[i] == ')') {
                if (s[i - 1] == '(') {
                    if (i - 2 >= 0) {
                        f[i] = f[i - 2] + 2;
                    } else {
                        f[i] = 2;
                    }
                } else if (i - f[i - 1] - 1 >= 0 &&
                           s[i - f[i - 1] - 1] == '(') {
                    if (i - f[i - 1] - 2 >= 0) {
                        f[i] = f[i - 1] + f[i - f[i - 1] - 2] + 2;
                    } else {
                        f[i] = f[i - 1] + 2;
                    }
                }
            }
        }
        return *max_element(f.begin(), f.end());
    }
};