算法分析与设计
最长公共子序列
问题描述:
给定两个序列X=<x1,x2,…,xm>和Y=<y1,y2,…,yn>,求X和Y长度最长的公共子序列。
算法
假设s1,s2两个序列
s1={1,3,4,5,6,7,7,8},
s2={3,5,7,4,8,6,7,8,2}
下面的推导图来自网上资料。
如果横竖(i,j)对应的两个元素相等,该格子的值 = c[i-1,j-1] + 1。如果不等,取c[i-1,j] 和 c[i,j-1]的最大值。首先初始化该表:
|
c[8,9] = S1 和 S2 的 LCS的长度,即为5。
核心代码:
for(int i=1;i<=len1;i++)
for(int j=1;j<=len2;j++)
if(s1[i]=s2[j])
dp[i][j]=dp[i-1][j-1]+1;
else dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
时间复杂度:
算法的时间复杂度为O(n*m)。
源码:
https://github.com/SpiritDemon-max/myText/blob/master/LCS.cpp