赞
踩
一个字符串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;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。