最长连续公共子数组,子串

1、描述

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

示例:

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

来源:力扣(LeetCode)
链接:

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

1.1公共子串,非连续

的链接

2、关键字

最长,公共子串,连续

3、思路

经典dp,
按第一个串初始化第一行,遍历第一个串,与第二个串的首元素进行比较,如果相等就初始化为1,不等就初始化为0,
按第二个串初始化第一列,与第一个串的首元素比较,如果相等就初始化为1,不等就初始化为0,
然后两层循环遍历二维dp数组,把最大值搞出来输出就好了,

还有一个求两个字符串的最长公共子串,不要求连续,
只是不相等的时候当前值的处理不同,这个题是直接置0,而不连续的是取左边和上边的最大值,

相等的时候都是取左上元素+1

4、notes

连续

5、复杂度

时间O(NM)
空间O(N
M)

6、code

class Solution {
public:
    int findLength(vector<int>& A, vector<int>& B) {
        int res=0;
        int n=A.size();  // 列数
        int m=B.size();  // 行数
        res=(A[0]==B[0])?1:0;  // res初始化二维数组的第一行第一列 abc  agt 
        vector<vector<int>>dp(m,vector<int>(n,0));
        for(int i=0;i<n;i++){  // 初始化第一行
            if(A[i]==B[0]){
                dp[0][i]=1;
                res = max(res, dp[0][i]); // 更新了一个测试案例
            }
        }
        for(int j=0;j<m;j++){  // 初始化第一列
            if(A[0]==B[j]){
                dp[j][0]=1;
                res = max(res, dp[j][0]);
            }
        }
        for(int i=1;i<m;i++){  // 填充剩下的二维数组
            for(int j=1;j<n;j++){
                if(B[i]==A[j]){
                    dp[i][j]=dp[i-1][j-1]+1;
                }
                else{
                    dp[i][j]=0;
                }
                res=max(res,dp[i][j]);
            }
        }
    return res;
    }
};
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值