LeetCode 32. 最长有效括号

题目描述

给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度。

示例1:

输入: "(()"
输出: 2
解释: 最长有效括号子串为 "()"

示例2:

输入: ")()())"
输出: 4
解释: 最长有效括号子串为 "()()"

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-valid-parentheses

思路解析

动态规划

dp[i] 表示以第 i 个字符结尾的有效括号子串长度。
s[i] == '(',则 dp[i] = 0
s[i] == ')',则考虑s[i - 1]
  若 s[i - 1] == '(',则 dp[i] = dp[i - 2] + 2
  若 s[i - 1] == ')',则考虑 s[i - dp[i - 1] - 1]
    若 s[i - dp[i - 1] - 1] == '(',则 dp[i] = dp[i - dp[i - 1] - 2] + dp[i - 1] + 2

注意不要写太多层的判断,尽量将判别式合并在一起,否则会出现栈溢出。

代码实现

class Solution {
public:
    int longestValidParentheses(string s) {
        vector<int> dp(s.length());
        int maxLen = 0;
        for(int i = 1; i < s.length(); i++) {
            if(s[i] == ')') {
                if(s[i - 1] == '(')
                    dp[i] = (i > 1) ? (dp[i - 2] + 2) : 2;
                else if(i > dp[i - 1] && s[i - dp[i - 1] - 1] == '(') {
                    dp[i] = ((i - dp[i - 1] > 1) ? dp[i - dp[i - 1] - 2] : 0) + dp[i - 1] + 2;
                }
            }
            maxLen = (dp[i] > maxLen) ? dp[i] : maxLen;
        }
        return maxLen;
    }
};
posted @ 2020-10-28 10:48  行者橙子  阅读(79)  评论(0编辑  收藏  举报