题目描述:给两个整数数组 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 <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
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)