当前位置:   article > 正文

计蒜客 最长共公子串_应该字符串a的子串被定义成从a中顺次选出

应该字符串a的子串被定义成从a中顺次选出

一个字符串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代码:

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. using namespace std;
  5. const int maxn=2000+10;
  6. char s1[maxn],s2[maxn];
  7. int dp[maxn][maxn];
  8. int main(){
  9. while(scanf("%s%s",s1+1,s2+1)==2){
  10. int l1=strlen(s1+1);
  11. int l2=strlen(s2+1);
  12. memset(dp,0,sizeof(dp));
  13. for(int i=1;i<=l1;i++){
  14. for(int j=1;j<=l2;j++){
  15. if(s1[i]==s2[j]){
  16. dp[i][j]=dp[i-1][j-1]+1;
  17. }
  18. else dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
  19. }
  20. }
  21. printf("%d\n",dp[l1][l2]);
  22. }
  23. return 0;
  24. }


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/193658
推荐阅读
相关标签
  

闽ICP备14008679号