zoukankan      html  css  js  c++  java
  • 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;
        }
    };
    
  • 相关阅读:
    CTF SQL注入知识点
    Rot13加密算法
    LFU缓存
    Redability
    快排
    更新卡片的zIndex
    webshell文件下载器
    [转]背包九讲
    hihocoder第196周
    Python import容易犯的一个错误
  • 原文地址:https://www.cnblogs.com/xqmeng/p/13889723.html
Copyright © 2011-2022 走看看