求2个字符串的最大公共子序列(可不连续)
比如:a = ‘ABCBDAB’ ,b = ‘BDCABA’,公共子序列为‘BCBA’
这2篇文章写的很好:
def LCS_str(s1,s2):
n = len(s1)
m = len(s2)
arr = [[0 for i in range(m+1)] for j in range(n+1)]
flag = [[0 for i in range(m+1)] for j in range(n+1)]
for i in range(n):
for j in range(m):
if s1[i] == s2[j]: #如果2个字符相等,加1
arr[i+1][j+1] = arr[i][j]+1
flag[i+1][j+1] = 'ok'
elif arr[i+1][j]>arr[i][j+1]:
arr[i+1][j+1] = arr[i+1][j]
flag[i+1][j+1] = 'left'
else:
arr[i+1][j+1] = arr[i][j+1]
flag[i+1][j+1] = 'up'
return arr,flag
#print(LCS_str(a,b))
def printLCS(flag,a,i,j):
if i==0 or j==0:
return
if flag[i][j]=='ok':
printLCS(flag,a,i-1,j-1)
print(a[i-1],end='')
elif flag[i][j]=='left':
printLCS(flag,a,i,j-1)
else:
printLCS(flag,a,i-1,j)
#a = [1,3,4,5,6,7,7,8]
#b = [3,5,7,4,8,6,7,8,2]
a = 'ABCBDAB'
b = 'BDCABA'
c,flag = LCS_str(a,b)
printLCS(flag,a,len(a),len(b))
print('================')
for i in c:
print(i)
print('---------------')
for i in flag:
print(i)
版权声明:本文为Eat_shopping原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。