初学最长上升子序列心得

想要了解最长公共子序列首先要清楚这些概念:

<1> 子序列:就是在原序列中找出一部分组成的序列。 例:字符串“abcdefg” 的子序列有 “ac”、“ade”....一共有27个子序列。

<2> 最长公共子序列:一个序列 ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 称为已知序列的最长公共子序列。例:字符串“cnblogs和“belong”的最长公共子序列为“blog”

<3> 子串:串中任意个连续的字符组成的子序列称为该串的子

<4> 最长公共子串:两个字符串中,最长的相同子字符串的长度(也是要求字串连续)

最长公共子串和最长公共子序列的区别子串是串的一个连续的部分,子序列则是从不改变序列的顺序,而从序列中去掉任意的元素而获得新的序列;

也就是说,子串中字符的位置必须是连续的,子序列则可以不必连续。

解决方法:动态规划算法

事实上,最长公共子序列问题也有最优子结构性质。
   记:
   Xi = 即X序列的前i个字符(1<= i <= m)(前缀)
   Yj = 即Y序列的前j个字符(1<= j <= m)(前缀)
   
   假定Z = 是LCS(X,Y)中的一个。
   ·若xm = yn(最后一个字符相同),则不难用反正法证明:该字符必是X与Y的任一最长公共子序列Z(设长度为k)的最后一个字符,即有zk = xm = yn,且显然有Zk-1∈LCS(Xm-1,Yn-1),即Z的前缀Zk-1是Xm-1与Yn-1的最长公共子序列。此时,问题化归成求Xm-1与Yn-1的LCS(LCS(X,Y))的长度等于LCS(Xm-1,Yn-1)的长度加1)。
   ·若xm≠yn,则亦不难用反证法证明:要么Z∈LCS(Xm-1, Y),要么Z∈LCS(X , Yn-1)。由于zk≠xm与zk≠yn其中至少有一个必成立,若zk≠xm则有Z∈LCS(Xm-1 , Y);类似的,若zk≠yn 则有Z∈LCS(X , Yn-1)。此时,问题化归成求Xm-1与Y的LCS及X与Yn-1的LCS。LCS(X , Y)的长度为:max{LCS(Xm-1 , Y)的长度, LCS(X , Yn-1)的长度}。
 
   由于上述当xm≠yn的情况中,求LCS(Xm-1 , Y)的长度与LCS(X , Yn-1)的长度,这两个问题不是相互独立的:两者都需要求LCS(Xm-1,Yn-1)的长度。另外两个序列的LCS中包含了两个序列的前缀的LCS,故问题具有最优子结构性质考虑用动态规划法。

也就是说,解决这个LCS问题,你要求三个方面的东西:
   1> LCS(Xm-1,Yn-1)+1;
   2> LCS(Xm-1,Y),LCS(X,Yn-1);

   3> max{LCS(Xm-1,Y),LCS(X,Yn-1)};


用c[i,j]记录序列Xi和Yj的最长公共子序列的长度,其中Xi=,Yj=。当i = 0或j = 0时,空序列是Xi和Yj的最长公共子序列,故c[i,j] = 0。其他情况下,可得递归关系如下所示:

由算法LCS_LENGTH和LCS计算出的结果如下图所示:

在序列X={A,B,C,B,D,A,B}和 Y={B,D,C,A,B,A}上,由LCS_LENGTH计算出的表c和b。第i行和第j列中的方块包含了c[i,j]的值以及指向b[i,j]的箭头。在c[7,6]的项4,表的右下角为X和Y的一个LCS的长度。对于i,j>0,项c[i,j]仅依赖于是否有xi=yi,及项c[i-1,j]和c[i,j-1]的值,这几个项都在c[i,j]之前计算。为了重构一个LCS的元素,从右下角开始跟踪b[i,j]的箭头即可,这条路径标示为阴影,这条路径上的每一个“↖”对应于一个使xi=yi为一个LCS的成员的项(高亮标示)。

for(i=1; i<=len1; i++)
		for(j=1; j<=len2; j++)
		{
			if(str1[i-1] ==str2[j-1])
				c[i][j] = c[i-1][j-1]+1;//当str1[i-1] ==str2[j-1]相等时, 直接在上一个最长子序列上加1; 
			else 
				c[i][j] = max(c[i][j-1],c[i-1][j]);//当str1[i-1] !=str2[j-1]相等时,找出 c[i][j-1],c[i-1][j]中谁最大; 
		}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值