最长公共子串:两个字符串中,连续的相同元素个数
最长公共子序:个人理解为两个字符串中,相同元素个数,这些元素的排列顺序要相同
比如:fish和fosh,最长公共子串长度为2,即sh;但是最长公共子序长度为3
代码实现
import numpy as np
def find_str(s1,s2):
# 寻找最长公共子串
m = len(s1)
n = len(s2)
cell = np.zeros((m+1,n+1),dtype = int)
#cell需要调用cell[i-1][j-1]
#所以多一行,第一行第一列可以理解为初始化
for i in range(1,m+1):
for j in range(1,n+1):
if s1[i-1] ==s2[j-1]:
cell[i][j] = cell[i-1][j-1]+1
else:
cell[i][j] = 0
return np.max(cell)
def find_seq(s1,s2):
#寻找最长公共子序
m = len(s1)
n = len(s2)
cell = np.zeros((m+1,n+1),dtype = int)
for i in range(1,m+1):
for j in range(1,n+1):
if s1[i-1] ==s2[j-1]:
cell[i][j] = cell[i-1][j-1]+1
else:
cell[i][j] = max(cell[i-1][j],cell[i][j-1])
return cell[-1][-1]
s1='fish'
s2='fosh'
find_str(s1,s2) #=2
find_seq(s1,s2) #=3
生物学家根据最长公共序列来确定DNA链的相似性,进而判断两种动物或疾病有多相似。最长公共序列还被用来寻找多发性硬化症治疗方案。
诸如git diff等命令,它们指出两个文件的差异,也是使用动态规划实现的。
本人初学者,如果有表述不准确的内容欢迎大家指正。
reference:《算法图解》,这本书很好理解,漫画风,算法入门很不错。