- 问题描述
一个给定序列的子序列是在该序列中删去若干个元素后所得到的序列。用数学语言表述,
给定序列 ,另一序列 ,X的子序列是指存在一个严格递增
下标序列 使得对于所有j=1,2,…,k有 。例如,序列 是序列
的一个子序列,或按紧凑格式书写,序列“bdca”是“abcdcba”的一个子序列。
若序列Z是序列X的子序列,又是序列Y的子序列,则称Z是序列X与Y的公共子序列。例如,序列“bcba”是“abcbdab”与“bdcaba”的公共子序列。
问题:
给定两个序列 X和 Y,找出序列X和Y的最长公共子序列。
例如,给出序列X:hsbafdreghsbacdba与序列Y:acdbegshbdrabsa,这两个序列的最长公共子序列如何求得? - 算法分析
(1)穷举法分析:
求序列X与Y的最长公共子序列可以使用穷举法:列出X的所有子序列,检查X的每一个子序列是否也是Y的子序列,并记录其中公共子序列的长度,通过比较最终求得X与Y的最长公共子序列。对于一个长度为m的序列X,其每一个子序列对应于下标集{1,2,…,m}的一个子集,即X的子序列数目多达2m个。由此可见应用穷举法求解是指数时间的。
(2)回溯法分析:
在穷举法的思想上,可以使用排列组合的知识来解决。把两个序列中长度最短m的进行组合(数组下标),分别由m—-1进行组合,得到由长到短的子序列。每组合一次就判断一下另一个序列中是否包含该子序列,如果包含该子序列,那么该子序列就是所要求得的LCS。要实现组合,可以使用回溯法进行组合。
(3)动态规划
1、 建立递推关系
设序列 X和Y 的最长公共子序列为 ,
与 (i=0,1,…,m;j=0,1,…,n)的最长公共子序列的长度为c(i,j)。
若i=m+1或j=n+1,此时为空序列,c(i,j)=0(边界条件)。
若x(1)
动态规划之最长公共子序列(LCS)
最新推荐文章于 2022-06-05 08:58:34 发布