最长公共子序列python实现

        最长公共子序列是动态规划基本题目,下面按照动态规划基本步骤解出来。

1.找出最优解的性质,并刻划其结构特征

序列a共有m个元素,序列b共有n个元素,如果a[m-1]==b[n-1],那么a[:m]和b[:n]的最长公共子序列长度就是a[:m-1]和b[:n-1]的最长公共子序列长度+1;如果a[m-1]!=b[n-1],那么a[:m]和b[:n]的最长公共子序列长度就是MAX(a[:m-1]和b[:n]的最长公共子序列长度,a[:m]和b[:n-1]的最长公共子序列长度)。

2.递归定义最优值


3.以自底向上大方式计算出最优值

python代码如下:
def lcs(a,b):
	lena=len(a)
	lenb=len(b)
	c=[[0 for i in range(lenb+1)] for j in range(lena+1)]
	flag=[[0 for i in range(lenb+1)] for j in range(lena+1)]
	for i in range(lena):
		for j in range(lenb):
			if a[i]==b[j]:
				c[i+1][j+1]=c[i][j]+1
				flag[i+1][j+1]='ok'
			elif c[i+1][j]>c[i][j+1]:
				c[i+1][j+1]=c[i+1][j]
				flag[i+1][j+1]='left'
			else:
				c[i+1][j+1]=c[i][j+1]
				flag[i+1][j+1]='up'
	return c,flag

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='ABCBDAB'
b='BDCABA'
c,flag=lcs(a,b)
for i in c:
	print(i)
print('')
for j in flag:
	print(j)
print('')
printLcs(flag,a,len(a),len(b))
print('')


运行结果输出如下:


4.根据计算最优值得到的信息,构造最优解

上图是运行结果,第一个矩阵是计算公共子序列长度的,可以看到最长是4;第二个矩阵是构造这个最优解用的;最后输出一个最优解BCBA。


最长公共子序列(Longest Common Subsequence,简称LCS)是指在两个序列中找到一个最长子序列,使得该子序列在两个序列中出现的顺序一致,但不要求连续。下面是一个用Python实现最长公共子序列的示例: ```python def longest_common_subsequence(seq1, seq2): m = len(seq1) n = len(seq2) # 创建一个二维数组来存储中间结果 dp = [[0] * (n+1) for _ in range(m+1)] # 填充二维数组,计算LCS的长度 for i in range(1, m+1): for j in range(1, n+1): if seq1[i-1] == seq2[j-1]: dp[i][j] = dp[i-1][j-1] + 1 else: dp[i][j] = max(dp[i-1][j], dp[i][j-1]) # 从二维数组中构建LCS lcs = [] i, j = m, n while i > 0 and j > 0: if seq1[i-1] == seq2[j-1]: lcs.append(seq1[i-1]) i -= 1 j -= 1 elif dp[i-1][j] > dp[i][j-1]: i -= 1 else: j -= 1 # 反转LCS得到最终结果 lcs.reverse() return lcs # 示例用法 seq1 = "ABCDGH" seq2 = "AEDFHR" lcs = longest_common_subsequence(seq1, seq2) print("Longest Common Subsequence:", "".join(lcs)) ``` 在这个示例中,我们定义了一个`longest_common_subsequence`函数,它接受两个序列`seq1`和`seq2`作为输入。函数使用动态规划的方法计算LCS的长度,并构建LCS序列。 在主程序中,我们使用示例输入序列`"ABCDGH"`和`"AEDFHR"`来测试`longest_common_subsequence`函数,并打印最长公共子序列。 运行上述代码,输出结果将是: ``` Longest Common Subsequence: ADH ``` 这表示序列`"ADH"`是`"ABCDGH"`和`"AEDFHR"`的最长公共子序列。 希望这个示例对你有帮助!如果你还有其他问题,请随时提问。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值