python -- 最长公共子序列

30 篇文章 0 订阅
22 篇文章 1 订阅
#! /usr/bin/env python3
# -*- coding: utf-8 -*-

# 最长公共子序列
# fish fosh >>> fsh
def findlongestsubstring(source, dest): # 输入值, 要比较的值
	inLen = len(source)
	outLen = len(dest)

	target = []
	cell = [ [0 for j in range(inLen+1)] for i in range(outLen+1)]

	for i in range(1, outLen+1):
		for j in range(1, inLen+1):
			if dest[i-1] == source[j-1]:
				cell[i][j] = cell[i-1][j-1] + 1
				target.append(dest[i-1])
			else:
				cell[i][j] = max(cell[i-1][j], cell[i][j-1])
	for i in range(1, outLen+1):
		for j in range(1, inLen+1):
			print(cell[i][j], end=', ')
		print()
	print("The Longest sub sequence of \"%s\" and \"%s\" is %s" % (source, dest, target))

if __name__ == "__main__":
	findlongestsubstring("fish", "fosh")

核心思想:

if word_a[i] == word_b[j]: ←--------两个字母相同
    cell[i][j] = cell[i-1][j-1] + 1
else: ←------------------------------两个字母不同
    cell[i][j] = max(cell[i-1][j], cell[i][j-1])

tips

1. 生物学家根据最长公共序列来确定DNA链的相似性,进而判断度两种动物或疾病有多相似。最长公共序列还被用来寻找多发性硬化症治疗方案。


2. 你使用过诸如 git diff 等命令吗?它们指出两个文件的差异,也是使用动态规划实现的。


3. 前面讨论了字符串的相似程度。编辑距离 (levenshtein distance)指出了两个字符串的相似程度,也是使用动态规划计算得到的。编辑距离算法的用途很多,从拼写检查到判断用户上传的资料是否是盗版,都在其中。


4. 你使用过诸如Microsoft Word等具有断字功能的应用程序吗?它们如何确定在什么地方断字以确保行长一致呢?使用动态规划!


动态规划总结:

1. 需要在给定约束条件下优化某种指标时,动态规划很有用。


2. 问题可分解为离散子问题时,可使用动态规划来解决。


3. 每种动态规划解决方案都涉及网格。


4. 单元格中的值通常就是你要优化的值。


5. 每个单元格都是一个子问题,因此你需要考虑如何将问题分解为子问题。


6. 没有放之四海皆准的计算动态规划解决方案的公式。


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值