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

题目描述:给两个整数数组 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)

猜你喜欢

转载自blog.csdn.net/all_about_WZY/article/details/89918358