学习动态规划——最长公共子串和最长公共子序

 最长公共子串:两个字符串中,连续的相同元素个数

最长公共子序:个人理解为两个字符串中,相同元素个数,这些元素的排列顺序要相同

比如:fish和fosh,最长公共子串长度为2,即sh;但是最长公共子序长度为3

代码实现

import numpy as np
def find_str(s1,s2):
    # 寻找最长公共子串
    m = len(s1)
    n = len(s2)
    cell = np.zeros((m+1,n+1),dtype = int)
    #cell需要调用cell[i-1][j-1]
    #所以多一行,第一行第一列可以理解为初始化
    for i in range(1,m+1): 
        for j in range(1,n+1):
            if s1[i-1] ==s2[j-1]:
                cell[i][j] = cell[i-1][j-1]+1
            else:
                cell[i][j] = 0
    return np.max(cell)

def find_seq(s1,s2):
    #寻找最长公共子序
    m = len(s1)
    n = len(s2)
    cell = np.zeros((m+1,n+1),dtype = int)
    for i in range(1,m+1):
        for j in range(1,n+1):
            if s1[i-1] ==s2[j-1]:
                cell[i][j] = cell[i-1][j-1]+1
            else:
                cell[i][j] = max(cell[i-1][j],cell[i][j-1])
    return cell[-1][-1]

s1='fish'
s2='fosh'
find_str(s1,s2) #=2
find_seq(s1,s2) #=3

生物学家根据最长公共序列来确定DNA链的相似性,进而判断两种动物或疾病有多相似。最长公共序列还被用来寻找多发性硬化症治疗方案。
诸如git diff等命令,它们指出两个文件的差异,也是使用动态规划实现的。

本人初学者,如果有表述不准确的内容欢迎大家指正。

reference:《算法图解》,这本书很好理解,漫画风,算法入门很不错。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值