前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >最长重复子数组

最长重复子数组

作者头像
你的益达
发布2020-08-05 15:36:39
发布2020-08-05 15:36:39
1.6K00
代码可运行
举报
运行总次数:0
代码可运行

问题描述:

给两个整数数组 AB ,返回两个数组中公共的、长度最长的子数组的长度。

代码语言:javascript
代码运行次数:0
复制
示例 1:

输入:
A: [1,2,3,2,1]
B: [3,2,1,4,7]
输出: 3
解释: 
长度最长的公共子数组是 [3, 2, 1]。
说明:

1 <= len(A), len(B) <= 1000
0 <= A[i], B[i] < 100

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-length-of-repeated-subarray
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解决方案:

​ 模板题直接上dp,dp[i] [j] 为A数组以 i 结尾,B数组以 j 结尾的最长公共子串长度。

​ 传递函数:

dp[i][j] = \begin{cases}0 \qquad\qquad \qquad \qquad \quad A[i] != B[j] \\\ dp[i - 1][j - 1] + 1 \qquad else\end{cases}

​ 若当前A[i] 不等于 B[j]时,以A[i]结尾和以B[j]结尾的最长公共子串长度一定为0,若其相等时dp[i] [j] 取值等于dp[i] [j] 取值加1.

​ baseline:

​ 我们发现当前位置的值依赖于其上边的值和其左边的值,因此初始化时只需填完第一行和第一列的值即可。

dp[i][0] = \begin{cases}1 \qquad A[i] = B[0] \\\ 0 \qquad else\end{cases}

dp[0][j] = \begin{cases}1 \qquad A[0] = B[j] \\\ 0 \qquad else\end{cases}

​ 实现代码如下:

代码语言:javascript
代码运行次数:0
复制
class Solution {
    public int findLength(int[] A, int[] B) {
        int M = A.length, N = B.length;
        int[][] dp = new int[M][N]; // dp[i][j] 表示A以i结尾 B以j结尾的最长公共子串的长度
        int max = 0;
        for(int j = 0; j < N; j++){
            if(B[j] == A[0]){
                dp[0][j] = 1;
                max = 1;
            }
        }
        for(int i = 0; i < M; i++){
            if(A[i] == B[0]){
                dp[i][0] = 1;
                max = 1;
            }
        }
        for(int i = 1; i < M; i++){
            for(int j = 1; j < N; j++){
                if(A[i] == B[j]){
                    dp[i][j] = dp[i - 1][j - 1] + 1;
                }
                max = Math.max(dp[i][j], max);
            }
        }
        return max;
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-07-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题描述:
  • 解决方案:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档