动态规划(6)-最长的括号子串

最长的括号子串

https://www.nowcoder.com/practice/45fd68024a4c4e97a8d6c45fc61dc6ad?tpId=117&tqId=37745&rp=1&ru=%2Fta%2Fjob-code-high&qru=%2Fta%2Fjob-code-high%2Fquestion-ranking&tab=answerKey

题目描述

给出一个仅包含字符'('和')'的字符串,计算最长的格式正确的括号子串的长度。
对于字符串"(()"来说,最长的格式正确的子串是"()",长度为2.
再举一个例子:对于字符串")()())",来说,最长的格式正确的子串是"()()",长度为4.

示例1

输入
"(()"
返回值
2

思路

  1. Q1:dp如何设置?
    一开始我设置dp[n+1][n+1],因为这题感觉和回文子串有点想,然而最后发现并不行,看过题解后发现别人设置dp[n+1],dp[i]表示s[:i]的结果。
  2. Q2:状态转移方程
    看的别人题解,十分地巧妙,具体可看https://leetcode-cn.com/problems/longest-valid-parentheses/solution/zui-chang-you-xiao-gua-hao-by-leetcode-solution/

code

import java.util.*;
public class Solution {
    public int longestValidParentheses (String s) {
        char[] chs = s.toCharArray();
        int n = chs.length;
        if(n==0)return 0;
        int[] dp = new int[n];
        int max=0;
        for(int i=1;i<n;i++){
            if(chs[i]==')'){
                if(chs[i-1]=='(') 
                    dp[i]=(i>=2?dp[i-2]:0)+2;
                else if(i-dp[i-1]>0 && chs[i-dp[i-1]-1]=='('){
                    if(i-dp[i-1]-2>=0)
                        dp[i]=dp[i-1]+dp[i-dp[i-1]-2]+2;
                    else
                        dp[i]=dp[i-1]+2;
                }
                max = Math.max(max,dp[i]);
            }
        }
        return max;
    }
}
全部评论

相关推荐

08-21 10:11
已编辑
南京邮电大学 Java
Java后端劝退第一...:我mentor也人很好,感觉就是同龄人,昨天出去散步看他摘了根狗尾巴草一直转,特别搞笑
你被mentor骂过吗?
点赞 评论 收藏
分享
08-11 11:16
已编辑
天津工业大学 Java
程序员牛肉:我个人觉得就是中厂吧,运气好点能进个大厂。 八月找暑期当然找不到了,现在各大厂的暑期实习一般都是三月多开放,五月多收尾。你这都八月多了肯定找不到,相当于是半夜去逛商场了。吃了信息差的亏了。 简历上的实习部分有很大的问题。你作为应聘后端的同学,实习经历中看不出来你干了哪些后端需求,一眼扫过去都是一些配置类的需求,Swagger文档就不要拿出来了。以及撰写技术文档和写单测这种经历。 所以建议你重写一下你的实习部分,重点突出需求,需求啊同学。比如详细的说一下自己是怎么使用GraalVM以及虚拟线程提高项目启动速度的。 调研了什么技术,有什么收获,有什么可以拿出来讲的技术点。
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务