/*
最长公共子序列:
假定,A=a 1 a 2 …a n 是字母表∑上的一个字符序列,如果存在
∑上的另外一个字符序列S=c 1 c 2 …c j ,使得对所有的k,
k=1,2,…,j,有c k =a ik (其中,1≤ik≤n),是字符序列A的一个
下标递增序列,则称字符序列S是A的子序列。
如果∑={x,y,x}, ∑上的字符序列是A=xyzyxzxz,则xxx是A的
一个长度为3的子序列。该子序列中的字符,对应于A的下
标是1,5,7。而xzyzx是A的长度为5的子序列,对应于A的下
标是1,3,4,6,7.
分析:
令序列A=a1a2...an和B=b1b2...bm,记A=a1a2...ak为A中最前面连续k个字符的子序列,
序列A和序列B的最长公共子序列性质:
1)若an = bm,序列Sk = c1c2...ck是A和B的最长公共子序列,有an = bm = ck,
且序列Sk-1=c1c2...ck-1是序列An-1和Bm-1的长度为k-1的最长公共子序列
2)若an != bm,且an != ck,那么应该将序列A最后字符an排除,用An-1与B进行比较
Sk 是An-1与Bm的长度为k的最长公共子序列
3)若an != bm,且bm != ck,Sk是An与Bm-1的长度为k最长公共子序列
划分状态:
第一阶段:计算A1和Bj的LCS长度L1,j ,j = 1,2,...,m
第二阶段: 计算A2和Bj的LCS长度L2,j ,j = 1,2,...,m
...
第n阶段 :计算An和Bj的LCS长度Ln,j ,j = 1,2,...,m
第n阶段中的Ln,m是序列An和Bm的最长公共子序列的长度
搜索状态:
设置二维状态数组si,j。
si,j = 1,ai = bj
si,j = 2,ai != bj,且Li-1,j >= Li,j-1,序列A优先
si,j = 3,ai != bj,且Li-1,j < Li,j-1,序列B优先
设Ln,m=k,Sk=c1c2...ck是An和Bm的长度为k的最长公共子序列,搜索过程从状态字Sn,m开始。
若sn,m=1,an =
算法设计与分析:第四章 动态规划 4.5最长公共子序列
最新推荐文章于 2025-05-11 11:10:23 发布