问题
- 一个序列 S S 任意删除若干个字符得到新序列,则 T T 叫做的子序列;
- 两个序列
X
X
和的公共子序列中,长度最长的那个,定义为
X
X
和的最长公共子序列(LCS,Longest Common Subsequence):
- 字符串 13455 13455 与 245576 245576 的最长公共子序列为 455 455
- 字符串 acdfg a c d f g 与 adfc a d f c 的最长公共子序列为 adf a d f
- 注意区别最长公共子串(Longest Common Substring)
- 最长公共子串要求连续
分析
暴力求解法
- 假定字符串 X X 和的长度分别为 m m ,;
- X X 的一个子序列即下标序列的严格递增子序列,因此 X X 共有个不同的子序列;同理, Y Y 有个不同子序列,从而穷举搜索法需要指数时间 O(2m∗2n) O ( 2 m ∗ 2 n ) ;
- 对 X X 的每一个子序列,检查它是否也是的子序列,从而确定它是否为 X X 和的公共子序列,并且在检查过程中选出最长的公共子序列;
LCS解法探索
LCS的记号
- 字符串 X X ,长度为,从1开始数;
- 字符串 Y Y ,长度为,从1开始数;
- Xi=<x1,...,xi> X i =< x 1 , . . . , x i > 即 X X 序列的前个字符( 1≤i≤m 1 ≤ i ≤ m )( Xi X i 不妨读作字符串 X X 的前缀);
- Yj=<y1,...,yi> Y j =< y 1 , . . . , y i > 即 Y Y 序列的前个字符( 1≤j≤n 1 ≤ j ≤ n )(字符串 Y Y 的前缀);
-
LCS(X,Y)
L
C
S
(
X
,
Y
)
为字符串
X
X
和的最长公共子序列,即为
Z=<z1,...,zk>
Z
=<
z
1
,
.
.
.
,
z
k
>
;
- 注意:事实上, X X 和可能存在多个子串,长度相同并且最大,因此, LCS(X,Y) L C S ( X , Y ) 严格的说,是个字符串集合。即 Z∈LCS(X,Y) Z ∈ L C S ( X , Y ) ;