1. 题目
读题
https://leetcode.cn/problems/maximum-length-of-repeated-subarray/description/
考查点
2. 解法
思路
这道题的思路是使用动态规划来求解。动态规划是一种将复杂问题分解为子问题的方法,通过记录子问题的解,避免重复计算,从而提高效率。动态规划的关键是找到状态和状态转移方程。
在这道题中,
我们可以定义状态为dp[i][j],表示以A[i-1]和B[j-1]结尾的最长重复子数组的长度。
状态转移方程为:
- 如果A[i-1]和B[j-1]相等,那么dp[i][j]等于dp[i-1][j-1]加一,因为我们可以将A[i-1]和B[j-1]加到前面的重复子数组中。
- 如果A[i-1]和B[j-1]不相等,那么dp[i][j]等于0,因为没有重复子数组以A[i-1]和B[j-1]结尾。
最后,我们遍历dp数组,找到最大值,就是答案。
代码逻辑
代码的逻辑可以分为以下几个步骤:
- 创建一个m+1行n+1列的二维数组dp,用来存储动态规划的状态。
- 初始化dp数组的第一行和第一列为0,表示没有重复子数组以空字符结尾。
- 遍历A和B的每个元素,根据状态转移方程更新dp数组的值。
- 遍历dp数组,找到最大值,作为答案返回。
具体来说,代码的逻辑如下:
- 定义一个变量max,用来记录最大值,初始为0。
- 定义一个变量m,用来记录A的长度。
- 定义一个变量n,用来记录B的长度。
- 创建一个m+1行n+1列的二维数组dp,用来存储动态规划的状态。
- 用双重循环遍历dp数组的每个元素,初始化为0。
- 用双重循环遍历A和B的每个元素,根据状态转移方程更新dp数组的值。具体地,如果A[i-1]和B[j-1]相等,那么dp[i][j]等于dp[i-1][j-1]加一,否则dp[i][j]等于0。同时,更新max的值,如果dp[i][j]大于max,那么将max赋值为dp[i][j]。
- 返回max作为答案。
具体实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | class Solution { public int findLength( int [] A, int [] B) { int m = A.length; int n = B.length; // dp[i][j]表示以A[i-1]和B[j-1]结尾的最长重复子数组的长度 int [][] dp = new int [m+ 1 ][n+ 1 ]; // 初始化为0 for ( int i = 0 ; i <= m; i++) { dp[i][ 0 ] = 0 ; } for ( int j = 0 ; j <= n; j++) { dp[ 0 ][j] = 0 ; } // 状态转移 int max = 0 ; // 记录最大值 for ( int i = 1 ; i <= m; i++) { for ( int j = 1 ; j <= n; j++) { // 如果A[i-1]和B[j-1]相等,那么dp[i][j]等于dp[i-1][j-1]加一 if (A[i- 1 ] == B[j- 1 ]) { dp[i][j] = dp[i- 1 ][j- 1 ] + 1 ; // 更新最大值 max = Math.max(max, dp[i][j]); } else { // 否则,dp[i][j]等于0,表示没有重复子数组以A[i-1]和B[j-1]结尾 dp[i][j] = 0 ; } } } // 返回最大值 return max; } } |
3. 总结
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
2019-05-01 java中的12种锁
2019-05-01 公平锁与非公平锁
2019-05-01 设计模式:门面模式(Facade)
2019-05-01 设计模式:装饰者模式
2019-05-01 设计模式:组合模式
2019-05-01 设计模式:桥接模式
2019-05-01 设计模式:适配器模式(Adapter)