【问题描述】输入俩个字符串,求解存在于这俩个字符串序列中的最长公共子串并输出
【输入形式】1:A,B,C,A,D,B,B;
2:B,C,E,D,B,B
【输出形式】D,B,B
【题目解析】这里所说的公共子串,要求在俩个原序列中连续,这也是与之前公共子序列问题相区别的最大点。就如例题中给出的输出形式我们可以发现,公共子串无论在原序列1或是原序列2中都是连续的。处理时最容易想到的便是暴力求解,依次遍历序列1与2去比较。并对每次的结果进行比较,保留长度最大的公共子串。这种思想容易想到,但空间时间复杂度较高,对资源开销巨大。通过分析我们容易发现,最长公共子串为4时,一定存在公共子串长度为3,2,1的子串 。例如:最长公共子串为D,B,B;其长度为3,存在公共子串:D,B;其长度为2,同理存在B;D等长度为1的子串;可以看出最长子串包含前一长度下的最优子结构,并且存在重叠子问题(即在前一长度串的基础下求出本次最佳串),那么我们便容易想到此问题仍然可以采取动态规划的思路解决此问题来降低开销。
【核心思路】这里我们仍然通过定义二维数组,记录俩个字符数组中元素每次遍历比较的结果来求解。同样是自底向上的分析处理,并且通过设置追踪变量来找到最大公共子串元素。具体实现如下:
一、定义:为了方便处理问题,这里我们做如下定义: