0.问题描述
0.1example
eg.X=(A, B, C, B, D, B)
W=(B, D, A)不是X的子序列,因为X中D之后没有A元素
Z=(B, C, D, B)是X的子序列,因为X中按顺序存在Z中元素
即使Z在元素在X里不连续也可以!!!只要顺序对上了就行
0.2公共子序列
Z是序列X与Y的公共子序列如果Z是X的子序列也是Y的子序列。
0.3LCS
最长公共子序列
0.4 第i前缀
设X=(x1, x2, …, xn)是一个序列
则Xi=(x1, …, xi)是X的第i前缀
0.5 C( , )
1.算法思想
1.1 核心思想:从X和Y数组的最后的元素开始处理问题,如果xm = yn则把xm和yn从X,Y中去掉,处理前面的元素。若不相等则有两种处理方式
在上式的基础上可得到
c[i,j]在i = 0 || j = 0时为0!!!
所以下图中的C(i,j)可能:
1.来自左上方元素
2.来自上方元素
3.来自左方元素
所以可以递归的求解问题
下图中先求出来第一行和第一列,其他元素便可解。其他元素可以按行求解也可以按列求解
2.算法实例
第一行对应的i为0
第一列对应的j为0
c[i,j]在i = 0 || j = 0时为0!!!
在上图的基础上再加上三种箭头表示数值的来源
3.伪代码
4.复杂性分析
时间复杂性
计算代价的时间
(i, j)两层循环
O(mn)
构造最优解的时间: O(m+n)
总时间复杂性为:O(mn)
空间复杂性
使用数组C和B
需要空间O(mn)