下面这篇文章介绍一下在算法设计中动态规划的最长公共子序列的问题。
最长公共子序列问题所谓,也即是分别给出长度为n和m的字符串A,B,然后找出其中最长公共子序列的最优值和最优解。
所谓最优值,也就是求出这个最长公共子序列的长度;而最优解,就是要求出这个最长最长公共子序列是什么的问题。给个不太恰当的例子:我们中学数学中经常会遇到求函数最值的问题,比如说求出函数 f(x) 的最大值,那么这个最大值就是最优值了;而最优解是什么呢?就是当f(x)取到最大值的时候的 x 值了。
解决的方法其实最简单的就是使用蛮力的方法,列举某一个字符串中的所有子序列,也就是求出这个字符串子序列的幂集;然后分别与另一字符串进行比较。那么由于幂集是 2 的 n 次方。所以其时间复杂度也就是 2 的 n 次方。
那么采用动态规划,可以通过寻求一个求最长公共子序列长度(下面简称LCS)的递推公式。
假设字符串 A = a1 a2 a3 a4.....ai B = b1 b2 b3 b4......bj
L[ i , j ]表示字符串A 和 B的最长公共子序列的长度。
那么:
稍作解释:①假如字符串A B中,有一个是长度为0;那么LCS = 0;