最长公共子串(动态规划)

迷南。 2022-06-08 10:07 368阅读 0赞

描述:

计算两个字符串的最大公共子串(Longest Common Substring)的长度,字符不区分大小写。

输入:

输入两个字符串

输出:

输出一个整数

样例输入:

  1. asdfas werasdfaswer

样例输出:

6

参考网址:http://blog.csdn.net/u013074465/article/details/45392687

这里的最大公共字串要求的字串是连续的。

求字串的方法和求子序列方法类似:

当s[i] == t[j]时,子序列长度f[i][j] = f[i - 1][j - 1] + 1;只是当str1[i] != str2[j]时,f[i][j]长度要为0,而不是max{f[i - 1][j], f[i][j - 1]}。

  1. #include<iostream>
  2. #include<string>
  3. #include<cstring>
  4. #define MAXN 200
  5. using namespace std;
  6. int f[MAXN+10][MAXN+10];
  7. string s,t;
  8. int main()
  9. {
  10. memset(f,0,sizeof(f));
  11. int i,j,ls,lt;
  12. cin>>s>>t;
  13. ls=s.size();
  14. lt=t.size();
  15. int maxn=0;
  16. for(i=0;i<ls;i++)//将大写转化为小写
  17. {
  18. if(s[i]>='A'&&s[i]<='Z') s[i]=tolower(s[i]);
  19. }
  20. for(i=0;i<lt;i++)
  21. {
  22. if(t[i]>='A'&&t[i]<='Z') t[i]=tolower(t[i]);
  23. }
  24. for(i=1;i<=ls;i++)
  25. {
  26. for(j=1;j<=lt;j++)
  27. {
  28. if(s[i-1]==t[j-1])
  29. {
  30. f[i][j]=f[i-1][j-1]+1;
  31. if(maxn<f[i][j]) maxn=f[i][j];
  32. }
  33. else
  34. {
  35. f[i][j]=0;
  36. }
  37. }
  38. }
  39. cout<<maxn<<endl;
  40. return 0;
  41. }

发表评论

表情:
评论列表 (有 0 条评论,368人围观)

还没有评论,来说两句吧...

相关阅读