题解 | #最长公共子数组#

最长公共子数组

http://www.nowcoder.com/practice/6032826d387c4a10ad3690cce5fdb015

题意:
        给定两个整数数组,求两个数组的最长的公共子数组的长度。

方法一:
动态规划

思路:
        dp[i][j]表示数组A以A[i]结尾,数组B以B[j]结尾公共子数组的长度。
        状态转移方程:
            
if(A[i-1]==B[j-1]){//如果相等,则+1
    dp[i][j]=dp[i-1][j-1]+1;
}else{//否则,置为0
    dp[i][j]=0;
}



class Solution {
public:
    int dp[1005][1005]={0};//dp[i][j]表示数组A以A[i]结尾,数组B以B[j]结尾公共子数组的长度
    int longestCommonSubarry(vector<int>& A, vector<int>& B) {
        int n=A.size(),m=B.size();
        int res=0;
        for(int i=1;i<=n;i++){//二重循环
            for(int j=1;j<=m;j++){
                if(A[i-1]==B[j-1]){//如果相等,则+1
                    dp[i][j]=dp[i-1][j-1]+1;
                }else{//否则,置为0
                    dp[i][j]=0; 
                }
                res=max(res,dp[i][j]);//维护最大值
            }
        }
        return res;
    }
};


时间复杂度:
空间复杂度:

方法二:
java实现

思路:
        思路同方法一相同,根据状态转移方程实现。


import java.util.*;


public class Solution {
    int[][] dp=new int[1005][1005];//dp[i][j]表示数组A以A[i]结尾,数组B以B[j]结尾公共子数组的长度
    public int longestCommonSubarry (int[] A, int[] B) {
        int n=A.length,m=B.length;
        int res=0;
        for(int i=1;i<=n;i++){//二重循环
            for(int j=1;j<=m;j++){
                if(A[i-1]==B[j-1]){//如果相等,则+1
                    dp[i][j]=dp[i-1][j-1]+1;
                }else{//否则,置为0
                    dp[i][j]=0; 
                }
                res=Math.max(res,dp[i][j]);//维护最大值
            }
        }
        return res;
    }
}

时间复杂度:
空间复杂度:






全部评论
求子数组,不是子长度
点赞 回复 分享
发布于 2023-04-22 07:22 河北

相关推荐

点赞 评论 收藏
分享
Twilight_m...:还是不够贴近现实,中关村那块60平房子200万怎么可能拿的下来,交个首付还差不多
点赞 评论 收藏
分享
真三hjdlxn:这么能吹还能找不到实习啊? 市分行写TOP投行,2个月的实习写半页。
点赞 评论 收藏
分享
07-25 10:17
仰恩大学 营销
bg双非,被挂了
投递拼多多集团-PDD等公司10个岗位
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务