字符串最长子串匹配dp矩阵[转载]

转自:https://blog.csdn.net/zls986992484/article/details/69863710

题目描述:求最长公共子串,sea和eat.它们的最长公共子串为ea,长度为2.。

#include <stdio.h>
#include <string.h>
#define N 50
int main(){
    char s1[N],s2[N];
    int dp[N][N],i,j,max_len=0;
    while(scanf("%s%s",&s1,&s2)!=EOF){
        int len1=strlen(s1);
        int len2=strlen(s2);
        for(int i=0;i<len1;i++){
            for(int j=0;j<len2;j++){
                if(i==0||j==0){
                    if(s1[i]==s2[j])
                        dp[i][j]=1;
                    else
                        dp[i][j]=0;
                }else{
                    if(s1[i]==s2[j])
                        dp[i][j]=dp[i-1][j-1]+1;
                    else
                        dp[i][j]=0;
                }
            if(dp[i][j]>max_len)
                max_len=dp[i][j];
        }

    }
    printf("%d\n",max_len);
    }

    return 0;
}

//dp自己想真的好难,想不出来,dp[i][j]表示的是什么呢?就是s1[i]和s2[j]中分别以i和j为结尾的子串(不一定包括i和j)最长匹配长度。那么很明显dp[i+1][j+1]=dp[i-1][j-1]+s[i]==s[j]?1:0;临界条件如何考虑呢?我写的还是比较简单的。O(m*n)的复杂度。

如果是用最基本的方法,那么就是两层for循环,一个i一个j分别指向当前,并且内部可以有m=i,n=j去判断后面的字符是否匹配,i和j一直控制的是整个字符串匹配的位置,一开始一直想的是如果i和j变了,那么谁去控制整个数组的循环呢?但是可以把它俩复制给别的变量啊。表示s1从i开始,s2从j开始(包括i和j)匹配的长度。dp是和它反过来的。

原文地址:https://www.cnblogs.com/BlueBlueSea/p/9232034.html