C++ 最长公共子序列 Sub Sequence
最长公共子序列是一个经典的基础算法问题 在两个序列中 如果序列1中的元素a也存在于序列2,则认为a是1,2的公共元素。 当序列3中的每一个元素都能够满足在不改变次序的情况下依次属于1,2,那么则认为3是1,2的公共子序列。多个公共子序列中,元素最多的即为最长公共子序列。
在学堂在线的算法课程中,有比较详细的课程讲述这个算法的构思。但是没有给出具体的实现,这里来自己实现一下。
首先使用表格模拟排列组合的所有情况: 以{a,b,c,d,e},{a,b,q,c,b}为例:
A\B | a | b | q | c | b |
---|---|---|---|---|---|
a | 1 | 1 | 1 | 1 | 1 |
b | 1 | 2 | 2 | 2 | 2 |
c | 1 | 2 | 2 | 3 | 3 |
d | 1 | 2 | 2 | 3 | 3 |
e | 1 | 2 | 2 | 3 | 3 |
实际上看到这样的填充,直觉上就应该反应出来,使用二维数组来解决。
其中当 A[i]!=B[j]
时,取左方或者上方更大的,而A[i]==B[j]
的时候,取T[i-1][j-1] + 1
。这里i=0或j=0的时候就不方便了,所以给矩阵默认增加一行 0 行。即
A\B | 0 | a | b | q | c | b |
---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 0 | 0 |
a | 0 | 1 | 1 | 1 | 1 | 1 |
b | 0 | 1 | 2 | 2 | 2 | 2 |
c | 0 | 1 | 2 | 2 | 3 | 3 |
d | 0 | 1 | 2 | 2 | 3 | 3 |
e | 0 | 1 | 2 | 2 | 3 | 3 |
最近回复