面试心得 --- GridSum(国双)算法工程师

时间:2021-12-03 14:21:42

面试题目:

最长公共子序列


解题分析:

动态规划的一个计算两个序列的最长公共子序列的方法如下:

以两个序列 X、Y 为例子:
设有二维数组f[i,j] 表示 X 的 i 位和 Y 的 j 位之前的最长公共子序列的长度,则有:

f[1][1] = same(1,1)
f[i][j] = max{f[i - 1][j - 1] + same(i,j), f[i - 1, j], f[i, j - 1]}


其中,same(a,b)当 X 的第 a 位与 Y 的第 b 位相同时为“1”,否则为“0”。


此时,二维数组中最大的数便是 X 和 Y 的最长公共子序列的长度,依据该数组回溯,便可找出最长公共子序列。


该算法的空间、时间复杂度均为O(n^2),经过优化后,空间复杂度可为O(n)。


如图:


面试心得 --- GridSum(国双)算法工程师



核心代码:


面试心得 --- GridSum(国双)算法工程师


完整代码可参考我的GitHub上ACM目录下,或者:


http://blog.csdn.net/u012965373/article/details/72480092