计蒜客 最长共公子串

来源:互联网 发布:拍拍失败淘宝 编辑:程序博客网 时间:2024/05/17 02:23

一个字符串A的子串被定义成从A中顺次选出若干个字符构成的串。如A=“cdaad" ,顺次选1,3,5个字符就构成子串" cad" ,现给定两个字符串,求它们的最长共公子串。

输入格式:第一行两个字符串用空格分开。

输出格式:最长子串的长度。

两个串的长度均小于2000

样例输入

abccd aecd

样例输出

3

分析:dp求解,状态方程:dp[i][j]表示第一个串长度为i,第二个串长度为j时的最长公共子串

dp[i][j]=dp[i-1][j-1]  (s1[i]==s2[j])

else

dp[i][j]=max(dp[i-1][j],dp[i][j-1]);

AC代码:

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn=2000+10;char s1[maxn],s2[maxn];int dp[maxn][maxn];int main(){while(scanf("%s%s",s1+1,s2+1)==2){int l1=strlen(s1+1);int l2=strlen(s2+1);memset(dp,0,sizeof(dp));for(int i=1;i<=l1;i++){for(int j=1;j<=l2;j++){if(s1[i]==s2[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\n",dp[l1][l2]);}return 0;}


阅读全文
0 0