此题在状态方程的寻找和描述上是比子序列简单的。9.69 最长公共子串(动态规划)——信息学竞赛培训课程_哔哩哔哩_bilibili
通过两层遍历可以求解问题。在第二个序列(内层循环中)逐个作为开头和第一个序列的每个字符开头比较,不断更新维护最大值。
在求解的时候,可以使用动态规划思想,(动态规划算法的基本思想是:将待求解的问题分解成若干个相互联系的子问题,先求解子问题,然后从这些子问题的解得到原问题的解;对于重复出现的子问题,只在第一次遇到的时候对它进行求解,并把答案保存起来,让以后再次遇到时直接引用答案,不必重新求解。动态规划算法将问题的解决方案视为一系列决策的结果。
通过状态记录方程dp。我们可以用dp[i][j]表示在str1中以第i个字符结尾在str2中以第j结尾时的公共子串长度。看格子表时候想法和子序列问题一致,和左图状态变量的表述一致。
最后使用sub截断字符串,在i中截断,需要记录最大值时的dp【i】【j】》max的位置,此时i就是最大字符串的尾部,所以要前推max个位置。