03 线型动态规划——LCS模型

最长公共子序列(Longest Common Subsequence)

最长公共子序列(longest common sequence)
最长公共子串(longest common substring)

1)什么是子序列呢?即一个给定的序列的子序列,就是将给定序列中零个或多个元素去掉之后得到的结果。
2)什么是子串呢?给定串中任意个连续的字符组成的子序列称为该串的子串。

【例1】最长公共子序列

【问题简述】
给定的字符序列 X =“x0,x1,…,xm-1” ,序列Y=“y0,y1,…,yk-1”是X的子序列,存在X的一个严格递增下标序列<i0,i1,…,ik-1>,使得对所有的j=0,1,…,k-1,有xij =yj。
例如,X=“ABCBDAB”,Y=“BCDB”是X的一个子序列。给出两个字符串S1和S2,长度不超过5000,求这两个字符串的最长公共子串长度。

【问题分析】
S1=“ABCBDAB”
S2=“BDCABA”
可以看出他们的最长公共子序列有BCBA,BDAB,长度为4
从样例分析,我们思考的方式为要找出S1串与S2串的公共子序列,假设将S1固定,从
第1个位置开始直到最后一个位置为止,与S2的各个部分不断找最长公共子序列
当然S1也可以变化,这样我们即得出了思路:
    枚举S1的位置 i
    枚举S2的位置 j
    找出S1的前i位与S2的前j位的最长公共子序列,直到两个串的最后一个位置为止。

S1=设f[i,j]表示S的前i位与T的前j位的最长公共子串长度。则有,

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值