LeetCode 718. 最长重复子数组
题目链接
题目分析
这个题很明显的DP问题,而且七月份的每日一题都是以DP为主,很好~~
但是在这个DP问题上,我又搞砸了,把子数组和子序列搞混了,对于一般的题目来说,子序列默认不连续,子数组默认连续。
具体来到DP问题的转移方程来说,对于子序列问题,当判断的两个字符不相等的时候:
if(A[i-1] != B[j-1]){
dp[i][j] = Math.max(dp[i-1][j], dp[i][j-1];
}
对于子数组问题,我们遇到不相等的情况下,可以直接跳过不分析。
当我们理清了这个思路就很好做了。
其转移方程就如下:
if(A[i-1] == B[j-1]){
dp[i][j] = dp[i-1][j-1]+1;
}
只有我们当前的两个字符相等,才能同时往前移一步去判断前面的字符是否相等。否则就直接让dp[i][j]=0即可。
代码实现
/**
* LC 718.最长重复子数组
* 这是个经典DP问题。
* 主要是子数组和子序列的区别。
* 子序列默认不连续,子数组默认连续。
* 我们在状态转移的时候就有区别了,如果是子序列,如果A[i-1] != B[j-1],我们dp[i][j] = Math.max(dp[i-1][j],dp[i][j-1])
* 但是在子数组中,这个就不能这么写了,我们如果遇到不同的字符,直接跳过不判断即可。
* 同时也因为这个情况,我们最大值可能在整个二维DP数组中的某一个位置出现,所以需要一个res记录其最大值。
* 2020年7月1日
* @param A
* @param B
* @return
*/
public int findLength(int[] A, int[] B) {
int[][] dp = new int[A.length+1][B.length+1];
int res = 0;
for(int i = 1; i < dp.length; i++){
for(int j = 1; j < dp[i].length; j++){
if(A[i-1] == B[j-1]){
dp[i][j] = dp[i-1][j-1] + 1;
res = Math.max(res,dp[i][j]);
}
}
}
return res;
}
总结
这几天一直在恶补DP,DP真的是见过的最烦人的题目类型,没有之一。
分类:
LeetCode每日一题
, LeetCode
标签:
leetcode
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
· 本地部署 DeepSeek:小白也能轻松搞定!
· 如何给本地部署的DeepSeek投喂数据,让他更懂你
· 从 Windows Forms 到微服务的经验教训
· 李飞飞的50美金比肩DeepSeek把CEO忽悠瘸了,倒霉的却是程序员
· 超详细,DeepSeek 接入PyCharm实现AI编程!(支持本地部署DeepSeek及官方Dee