欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

最长重复子数组

程序员文章站 2022-03-24 17:23:50
...

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

示例:

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

看起来很难吧,想了想,递归pass,动态规划emmmm,想想就难,栈?dfs?bfs?滑动窗口?我也不会写啊,,,,,,,啥也想不起来????

一看解析,我勒个擦,这么简单:

https://leetcode-cn.com/problems/maximum-length-of-repeated-subarray/solution/yi-zhang-biao-ba-ju-hua-kan-dong-dong-tai-gui-hua-/

就是一张图解决的事儿:

最长重复子数组

public class Solution {

    public int findLength(int[] A, int[] B) {

        int dp[][] = new int[A.length][B.length];

        // 相等就赋值为1
        for(int i=0; i<A.length; i++){
            for(int j=0; j<B.length; j++){
                if(A[i] == B[j]){
                    dp[i][j] = 1;
                }
            }
        }

        
        // 从前向后,加1
        for(int i=1; i<A.length; i++){
            for(int j=1; j<B.length; j++){
                if(dp[i-1][j-1] != 0 && dp[i][j] == 1){
                    dp[i][j] = dp[i-1][j-1] + 1;
                }
            }
        }

        // 找最大值
        int res = Integer.MIN_VALUE;
        for(int i=0; i<A.length; i++){
            for(int j=0; j<B.length; j++){
                if(dp[i][j] > res){
                    res = dp[i][j];
                }
            }
        }
        return res;
    }

    public static void main(String[] args) {
        Solution s = new Solution();
        s.findLength(new int[]{1,2,3,2,1}, new int[]{3,2,1,4,7});
    }
}