字符串最长子串匹配-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是和它反过来的。