一、求解两个字符串的最长公共子序列长度
# 求解两个字符串的最长公共子序列
# 比如字符串1:BDCABA;字符串2:ABCBDAB
#
# 则这两个字符串的最长公共子序列长度为4,最长公共子序列是:BCBA
# LCS(xn,ym)=LCS(xn-1,ym-1)+1 if x[n]==y[m]
# LCS(xn,ym)=max(LCS(xn,ym-1),LCS(xn,ym-1)) if x[n]!=y[m]
def maxsubseq(s1,s2):
if not s1 or not s2:
return 0
lcs=[[0 for i in range(len(s2))] for j in range(len(s1))]
if s1[0]==s2[0]:
lcs[0][0]=1
else:
lcs[0][0] = 0
for x in range(0,len(s1)):
for y in range(0,len(s2)):
if x==0 and y!=0:
if s1[x]==s2[y]:
for j in range(y,len(s2)):
lcs[x][j]=1
elif y==0:
if s1[x]==s2[y]:
for i in range(x,len(s1)):
lcs[i][y]=1
else:
if s1[x]==s2[y]:
lcs[x][y]=lcs[x-1][y-1]+1
else:
lcs[x][y]=max(lcs[x][y-1],lcs[x-1][y])
return lcs[-1][-1]
二、求解两个字符串的最长公共子序列
def subseq(s1,s2):
if not s1 or not s2:
raise ValueError
lcs=[[[] for i in range(len(s2))] for j in range(len(s1))]
if s1[0]==s2[0]:
lcs[0][0].append(s1[0])
else:
lcs[0][0] = []
for x in range(0,len(s1)):
for y in range(0,len(s2)):
if x==0 and y!=0:
if s1[x]==s2[y]:
for j in range(y,len(s2)):
lcs[x][j]=[s1[x]]
elif y==0:
if s1[x]==s2[y]:
for i in range(x,len(s1)):
lcs[i][y]=[s1[x]]
else:
if s1[x]==s2[y]:
lcs[x][y]=lcs[x-1][y-1]+[s1[x]]
else:
lcs[x][y]=lcs[x][y-1] if len(lcs[x][y-1])>len(lcs[x-1][y])else lcs[x-1][y]
return lcs[-1][-1]
s1='BDCABABFHJKL'
s2='ABCBDABGEF'
print(subseq(s1,s2))