返回

LeetCode_718_Maximum Length of Repeated Subarray_最长重复子数组

发布时间:2023-02-02 19:34:31 306

题目描述:给两个整数数组 A 和 B ,返回两个数组中公共的、长度最长的子数组的长度。
示例:

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

说明:

说明:

1 <= len(A), len(B) <= 1000
0 <= A[i], B[i] < 100

算法思想:使用动态规划求解问题,dp[i][j]表示A[i]和B[j]之前的最长重复子数组的长度,如dp[3][4]表示A[3]和B[4]之前的最长重复子数组。在进行两个字符比较时,分为两种情况。1、A[i]==B[j],则dp[i][j]=dp[i-1][j-1]+1。2、A[i]!=B[j],则继承之前的结果,即dp[i][j]=max(dp[i-1][j],dp[i][j-1])。

代码实现:

#include 
#include
#include
#include
using namespace std;

const int N=100;
char A[N],B[N];
int dp[N][N];//dp[i][j]表示A[i]和B[j]之前的LCS长度

int main()
{
gets(A+1);//从下标为1开始读入,获取字符串
gets(B+1);
int lenA=strlen(A+1);
int lenB=strlen(B+1);
//边界
for(int i=0;i<=lenA;i++){
dp[i][0]=0;
}
for(int j=0;j<=lenB;j++){
dp[0][j]=0;
}
//状态转移方程
for(int i=1;i<=lenA;i++){
for(int j=1;j<=lenB;j++){
if(A[i]==B[j]){
dp[i][j]=dp[i-1][j-1]+1;
}else{
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
}
}
}
printf("%d",dp[lenA][lenB]);
return 0;
}

时间复杂度为O(mn)

LeetCode_718_Maximum Length of Repeated Subarray_最长重复子数组_子数组

 

特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报
评论区(0)
按点赞数排序
用户头像
精选文章
thumb 中国研究员首次曝光美国国安局顶级后门—“方程式组织”
thumb 俄乌线上战争,网络攻击弥漫着数字硝烟
thumb 从网络安全角度了解俄罗斯入侵乌克兰的相关事件时间线