给出两个字符串:
HelloWorld,loop
最长子序列为:loo
最长子串为:lo
最长子序列:
特点通常为不连续,
从定义可得,这个矩阵的第一行和第一列都为0,而从第二行第二列往后的位置的值只跟之前左上方已经填写的值相关,因此开始用公式填写剩下的值。
通过回溯查找的方式来拿出公共序列,其大致代码如下:
最长公共子串:
在定义上,动态规划的子问题 res [ i ] [ j ] 变为以 A [ i ] 和 B [ j ] 为最后一个元素并且相等的最长子串长度,
def lc_string(string1, string2):
len1 = len(string1)
len2 = len(string2)
# 多生成一行一列,初始依然全为0
res = [[0 for i in range(len1 + 1)] for j in range(len2 + 1)]
# 记录最大长度
max_len = 0
# 记录最大长度子串最后一位的行索引
idx_r = 0
# 记录最大长度子串最后一位的列索引
idx_c = 0
# 依然从第二行第二列的位置开始填写
for i in range(1, len2 + 1):
for j in range(1, len1 + 1):
if string2[i - 1] == string1[j - 1]:
res[i][j] = res[i - 1][j - 1] + 1
if res[i][j] >= max_len:
max_len = res[i][j]
idx_r = i
idx_c = j
s = ''
while string2[idx_r - 1] == string1[idx_c - 1]:
s += string2[idx_r - 1]
idx_r -= 1
idx_c -= 1
return s[::-1], max_len