【问题】给定两个字符串A和B,长度分别为m和n,要求找出它们最长的公共子串,并返回其长度。例如:
A = "HelloWorld"
B = "loop"
则A与B的最长公共子串为 "lo",返回的长度为2。

【思路】最长公共子串的问题不同于最长公共子序列,由于子串的连续的,而子序列不一定连续。在上一个子序列中dp[i][j]是非减的,因此最后返回最大公共子序列时,返回的是dp[n][m]。而在最大子串问题中,dp[i][j]可能小于dp[i-1][j-1],因此需要一个res来保存更新最大值。

通俗考虑,在两个子串中寻找,假设a[i]==b[j]了,那么从i和j向后走,res会一直更新变大,一旦遇到不相等时,则dp[i][j]清零,寻找下一个重复的子串。因此其递推式为:

其中dp[i][0] = 0, dp[0][j] = 0;

class LongestSubstring {
public:
int findLongest(string A, int n, string B, int m) {
if(n == || m == )
return ;
int rs = ;
int dp[n + ][m + ];
for(int i = ; i <= n; i++)//初始状态
dp[i][] = ;
for(int i = ; i <= m; i++)
dp[][i] = ;
for(int i = ; i <= n; i++)
for(int j = ; j<= m; j++)
{
if(A[i - ] == B[j - ])
{
dp[i][j] = dp[i -][j - ] + ;
rs = max(rs,dp[i][j]);//每次更新记录最大值
} else//不相等的情况
dp[i][j] = ;
}
return rs;//返回的结果为rs
}
};

最新文章

  1. 同步与异步 &amp; 阻塞与非阻塞
  2. Mac下安装GIT的坑
  3. 在windows7 上安装 Sublime Text 3 及其插件
  4. 【C#】委托
  5. zw版【转发&#183;台湾nvp系列例程】halcon与delphi系列例程
  6. .NET开源工作流RoadFlow-系统布署中常见错误及处理方法
  7. #define XXX do{...}while(0)
  8. 【原】数据库SQL语句入门
  9. python_getpass 模块的使用
  10. 让织梦内容页arclist标签的当前文章标题加亮显示
  11. Shiro授权管理
  12. nginx: [emerg] getpwnam(&quot;nginx&quot;) failed
  13. 前端web服务器数据同步方案
  14. 用mysql workbench导出mysql数据库关系图
  15. 几种流行的AJAX框架对比:Jquery,Mootools,Dojo,ExtJs,Dwr
  16. 手写自己的ThreadLocal(线程局部变量)
  17. 前端_html
  18. SocketServer模块 《Python核心编程(第3版)》——2.5
  19. sql语句-3-聚合数据查询
  20. Elasticsearch NEST使用指南:映射和分析

热门文章

  1. 02.python实现排序算法
  2. CSS-text-intent
  3. STL中的全排列实现
  4. java 根据传入的时间获取当前月的第一天的0点0分0秒和最后一天的23点59分59秒
  5. Window Server 2019 配置篇(8)- 利用MDT定制自动加入域的脚本
  6. PAT (Advanced Level) 1124~1127:1124模拟 1125优先队列 1126欧拉通路 1127中序后序求Z字形层序遍历
  7. python 文本文件操作
  8. vue的MVVM
  9. vue打包部署(含2.0)
  10. 07.swoole学习笔记--tcp客户端