[算法] 最长公共子序列
其他
2018-08-06 00:18:26
阅读次数: 0
问题
- 一个序列
S
任意删除若干个字符得到新序列
T
,则
T
叫做
S
的子序列;
- 两个序列
X
和
Y
的公共子序列中,长度最长的那个,定义为
X
和
Y
的最长公共子序列(LCS,Longest Common Subsequence):
- 字符串
13455
与
245576
的最长公共子序列为
455
- 字符串
acdfg
与
adfc
的最长公共子序列为
adf
- 注意区别最长公共子串(Longest Common Substring)
分析
暴力求解法
- 假定字符串
X
和
Y
的长度分别为
m
,
n
;
-
X
的一个子序列即下标序列
{1,2,...,m}
的严格递增子序列,因此
X
共有
2m
个不同的子序列;同理,
Y
有
2n
个不同子序列,从而穷举搜索法需要指数时间
O(2m∗2n)
;
- 对
X
的每一个子序列,检查它是否也是
Y
的子序列,从而确定它是否为
X
和
Y
的公共子序列,并且在检查过程中选出最长的公共子序列;
LCS解法探索
LCS的记号
- 字符串
X
,长度为
m
,从1开始数;
- 字符串
Y
,长度为
n
,从1开始数;
-
Xi=<x1,...,xi>
即
X
序列的前
i
个字符(
1≤i≤m
)(
Xi
不妨读作字符串
X
的
i
前缀);
-
Yj=<y1,...,yi>
即
Y
序列的前
j
个字符(
1≤j≤n
)(字符串
Y
的
j
前缀);
-
LCS(X,Y)
为字符串
X
和
Y
的最长公共子序列,即为
Z=<z1,...,zk>
;
- 注意:事实上,
X
和
Y
可能存在多个子串,长度相同并且最大,因此,
LCS(X,Y)
严格的说,是个字符串集合。即
Z∈LCS(X,Y)
;
若 xm=yn
转载自blog.csdn.net/zkp_java/article/details/80768048