动态规划——最长公共子序列与最长公共子串 (含Python实现代码)
2021-04-24 01:29
标签:二维数组 splay 区别 play bst 符号 comm 说明 相关 英文名称: 主要区别:子串必须要连续,子序列不需要 方法差不多,有人看再更 动态规划——最长公共子序列与最长公共子串 (含Python实现代码) 标签:二维数组 splay 区别 play bst 符号 comm 说明 相关 原文地址:https://www.cnblogs.com/Homunculus/p/13266706.html动态规划——最长公共子序列与最长公共子串 (含Python实现代码)
最长公共子序列
c[i][j]表示字符串X1..i与Y1..j的最长公共子序列的长度
def longest_common_subsequence(X: str, Y: str):
index_x = len(X)+1 # columns
index_y = len(Y)+1 # rows
c = [[‘‘]*index_y for _ in range(index_x)]
for i in range(index_x):
for j in range(index_y):
if i == 0 or j == 0:
c[i][j] = ‘‘
continue
if X[i-1] == Y[j-1]:
c[i][j] = c[i-1][j-1] + X[i-1]
else:
if len(c[i-1][j]) > len(c[i][j-1]):
c[i][j] = c[i-1][j]
else:
c[i][j] = c[i][j-1]
return len(c[index_x-1][index_y-1]), c[index_x-1][index_y-1]
即 c[i][j] 存储的是一个字符串而非长度。在递推关系式上,第二项(Xi = Yj 时) 改为 c[i-1][j-1] + Xi。
这样最后既可以得到最大的长度,也可以知道最长的序列是什么。最长公共子串
文章标题:动态规划——最长公共子序列与最长公共子串 (含Python实现代码)
文章链接:http://soscw.com/essay/78729.html