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

最长公共子数组

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 河北

相关推荐

2025-12-16 22:45
已编辑
电子科技大学 活动运营
Rain_Codin...:简历感觉有点乱了而且一股AI味,AI简历的一个特点就是废话很多,一个点能分成四个点来讲,可以仔细优化一下。 btw,手机看简历不好看出来,可以把电脑上的简历截图放出来。
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

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