码迷,mamicode.com
首页 > 编程语言 > 详细

最长重复子数组

时间:2020-07-01 23:44:12      阅读:83      评论:0      收藏:0      [点我收藏+]

标签:image   col   pre   bar   ble   sub   img   turn   ref   

718. 最长重复子数组

技术图片

思路

这道题类似最长公共子序列,可以使用动态规划来解决。

技术图片

代码

二维的

/**
 * 1 <= len(A), len(B) <= 1000
 * 0 <= A[i], B[i] < 100
 */
class Solution {
    public int findLength(int[] A, int[] B) {
        int row = A.length;
        int col = B.length;

        int[][] dp = new int[row + 1][col + 1];
        int res = 0;
        
        for(int i = 1; i <= row; i++){
            for(int j = 1; j <= col; j++){
                if(A[i - 1] == B[j - 1]){
                    dp[i][j] = dp[i - 1][j - 1] + 1;
                    if(res < dp[i][j]){
                        res = dp[i][j];
                    }
                }
                else{
                    dp[i][j] = 0;
                }
            }
        }
        return res;
    }
}

一维的

/**
 * 1 <= len(A), len(B) <= 1000
 * 0 <= A[i], B[i] < 100
 */
class Solution {
    public int findLength(int[] A, int[] B) {
        int row = A.length;
        int col = B.length;

        int[] dp = new int[col + 1];
        int res = 0;

        for(int i = 1; i <= row; i++){
            //从后向前遍历,防止dp[j-1]的值被冲掉
            for(int j = col; j >= 1; j--){
                if(A[i - 1] == B[j - 1]){
                    dp[j] = dp[j - 1] + 1;
                }
                else{
                    dp[j] = 0;
                }
                res = Math.max(res, dp[j]);
            }
        }
        return res;
    }
}

最长重复子数组

标签:image   col   pre   bar   ble   sub   img   turn   ref   

原文地址:https://www.cnblogs.com/realzhaijiayu/p/13222185.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!