zoukankan      html  css  js  c++  java
  • LeetCode 718. 最长重复子数组

    题目链接

    718. 最长重复子数组

    题目分析

    这个题很明显的DP问题,而且七月份的每日一题都是以DP为主,很好~~
    但是在这个DP问题上,我又搞砸了,把子数组和子序列搞混了,对于一般的题目来说,子序列默认不连续,子数组默认连续。
    具体来到DP问题的转移方程来说,对于子序列问题,当判断的两个字符不相等的时候:

    if(A[i-1] != B[j-1]){
          dp[i][j] = Math.max(dp[i-1][j], dp[i][j-1];
    }
    

    对于子数组问题,我们遇到不相等的情况下,可以直接跳过不分析。
    当我们理清了这个思路就很好做了。
    其转移方程就如下:

    if(A[i-1] == B[j-1]){
          dp[i][j] = dp[i-1][j-1]+1;
    }
    

    只有我们当前的两个字符相等,才能同时往前移一步去判断前面的字符是否相等。否则就直接让dp[i][j]=0即可。

    代码实现

        /**
         * LC 718.最长重复子数组
         * 这是个经典DP问题。
         * 主要是子数组和子序列的区别。
         * 子序列默认不连续,子数组默认连续。
         * 我们在状态转移的时候就有区别了,如果是子序列,如果A[i-1] != B[j-1],我们dp[i][j] = Math.max(dp[i-1][j],dp[i][j-1])
         * 但是在子数组中,这个就不能这么写了,我们如果遇到不同的字符,直接跳过不判断即可。
         * 同时也因为这个情况,我们最大值可能在整个二维DP数组中的某一个位置出现,所以需要一个res记录其最大值。
         * 2020年7月1日
         * @param A
         * @param B
         * @return
         */
        public int findLength(int[] A, int[] B) {
            int[][] dp = new int[A.length+1][B.length+1];
            int res = 0;
            for(int i = 1; i < dp.length; i++){
                for(int j = 1; j < dp[i].length; j++){
                    if(A[i-1] == B[j-1]){
                        dp[i][j] = dp[i-1][j-1] + 1;
                        res = Math.max(res,dp[i][j]);
                    }
                }
            }
            return res;
        }
    

    总结

    这几天一直在恶补DP,DP真的是见过的最烦人的题目类型,没有之一。

  • 相关阅读:
    scala list
    scala 数组 基本类型
    oracle 索引 。其中全文检索最变态
    友盟分享(微信分享,微博分享,Facebook分享)
    iOS文字描边
    字符串限制条件
    IOS开发之格式化日期时间
    动态获取Textfield输入的内容
    iOS 微信分享 朋友圈
    iPhone屏幕尺寸、分辨率及适配
  • 原文地址:https://www.cnblogs.com/ZJPaang/p/13217717.html
Copyright © 2011-2022 走看看