概述
借鉴博客:https://blog.csdn.net/Scofield971031/article/details/89027314
代码如下:
def LCS(a,b):
n = len(a) + 1 # s辅助空间(二维数组)的长宽
m = len(b) + 1 # 加1是因为算法还需要一横一竖两列0来辅助
L = [[0] * m for i in range(n)] # 创建辅助空间(二维数组)并初始化全部元素为0
S = [[0] * m for i in range(n)] # 标记数组
for i in range(n):
L[i][0] = 0 # 辅助列
for j in range(m):
L[0][j] = 0 # 辅助行
for i in range(1,n): # 计数模块
for j in range(1,m):
if a[i-1] == b[j-1]:
L[i][j] = L[i-1][j-1] + 1 # 发现相等,计数器加一
S[i][j] = 'ok' # 标记为ok
elif L[i][j-1] > L[i-1][j]:
L[i][j] = L[i][j-1] # 左值大于上值,则取左
S[i][j] = 'left' # 标记为左
else:
L[i][j] = L[i-1][j] # 左值小于上值,则取上
S[i][j] = 'up' # 标记为上
i,j = len(a), len(b) # 开始迭代
Str = [] # 存放LCS
while L[i][j]: # 求LCS模块
temp = S[i][j]
if temp == 'ok': # 从右下往左上,一路找
Str.append(a[i-1]) # 找到了就存起来
i -= 1
j -= 1 # 向左上角找下一个
if temp == 'left':
j -= 1 # 向左找
if temp == 'up':
i -= 1 # 向上找
Str.reverse() # 反过来
c = "".join(Str) # 变成字符串
Ret = [L[n-1][m-1], c] # 用来返回的数组,内装最大公子序列和长度
return Ret
if __name__ == "__main__":
print("字符串xzyzzyx和zxyyzxz的最长公共子序列为",LCS("xzyzzyx","zxyyzxz")[1],"长度为",LCS("xzyzzyx","zxyyzxz")[0])
运行结果:字符串xzyzzyx和zxyyzxz的最长公共子序列为 xyzz 长度为 4
最后
以上就是靓丽老虎为你收集整理的【Python】算法设计之【动态规划】——最大子序列问题(LCS算法)的全部内容,希望文章能够帮你解决【Python】算法设计之【动态规划】——最大子序列问题(LCS算法)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复