zoukankan      html  css  js  c++  java
  • 代码题(60)— 最长重复子数组

    1、718. 最长重复子数组

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

    示例 1:

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

      这道题给了我们两个数组A和B,让我们返回连个数组的最长重复子数组。那么如果我们将数组换成字符串,实际这道题就是求Longest Common Substring的问题了,而貌似LeetCode上并没有这种明显的要求最长相同子串的题,注意需要跟最长子序列Longest Common Subsequence区分开,关于最长子序列会在follow up中讨论。好,先来看这道题,对于这种求极值的问题,DP是不二之选,我们使用一个二维的DP数组,其中dp[i][j]表示数组A的前i个数字和数组B的前j个数字的最长子数组的长度,如果dp[i][j]不为0,则A中第i个数组和B中第j个数字必须相等,比对于这两个数组[1,2,2]和[3,1,2],我们的dp数组为:

      3 1 2
    1 0 1 0
    2 0 0 2
    2 0 0 1

    我们注意观察,dp值不为0的地方,都是当A[i] == B[j]的地方,而且还要加上左上方的dp值,即dp[i-1][j-1],所以当前的dp[i][j]就等于dp[i-1][j-1] + 1,而一旦A[i] != B[j]时,直接赋值为0,不用多想,因为子数组是要连续的,一旦不匹配了,就不能再增加长度了。我们每次算出一个dp值,都要用来更新结果res,这样就能得到最长相同子数组的长度了,参见代码如下:

    class Solution {
    public:
        int findLength(vector<int>& A, vector<int>& B) {
            if(A.empty() || B.empty())
                return 0;
            int res = 0;
            vector<vector<int>> dp(A.size()+1,vector<int>(B.size()+1,0));
            for(int i=1;i<=A.size();++i)
            {
                for(int j=1;j<=B.size();++j)
                {
                    if(A[i-1]==B[j-1])
                        dp[i][j] = dp[i-1][j-1]+1;
                    else
                        dp[i][j] = 0;
                    res = max(res,dp[i][j]);
                }
            }
            return res;
        }
    };
  • 相关阅读:
    怎么把自己电脑上的文件传到服务器本地上
    查看hive中某个表中的数据、表结构及所在路径
    python2.7读汉字的时候出现乱码,如何解决
    如何连接服务器客户端
    java常用问题排查工具
    netty源码分析之一:server的启动
    java AQS 一:
    netty源码分析之二:accept请求
    java Resource
    二:基础概述netty
  • 原文地址:https://www.cnblogs.com/eilearn/p/9555056.html
Copyright © 2011-2022 走看看