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