求最长公共子串有两种情况:1, 不要求子串连续,两个字符串BDCABA和ABCBDAB,字符串BCBA和BDAB都是它们的最长公共子串。2, 要求子串连续。对于上面两个串来说,BD和AB是它们的最长公共子串。
一,有关连续的已经写过。设定一个矩阵p,p[i][j]表示以str1[i]和str2[j]结尾的子串的最大公共子串的长度。所以有递推式:
如果 str1[i] != str2[j], p[i][j] = 0.
如果 str1[i] = str2[j], p[i][j] = p[i-1][j-1] + 1.
二,如果不要求子串连续,处理有一些小的区别。还是设定一个矩阵p,p[i][j]表示str1[i]和str2[j]之前的子串最大公共子串的长度(不需要一定包含str1[i]或str2[j]),也就是说即使str1[i]和str2[j]不相等,也不能把p[i][j]清零。因为题目要求的子串不一定是连续的。所以这种情况的递推式为:
如果 str1[i] != str2[j], p[i][j] = max(p[i-1][j], p[i][j-1, p[i-1][j-1]).
如果 str1[i] = str2[j], p[i][j] = p[i-1][j-1] + 1.
而p[i-1][j-1]肯定小于前两者,所以第一个条件可改为:p[i][j] = max(p[i-1][j], p[i][j-1])。
为了避免重复计算或者浪费不必要的空间,可以从开始往后递推。
《编程之美》:最长公共子序列(串)
最新推荐文章于 2024-07-02 19:42:08 发布