看了《算法导论》中文第二版P208的动态规划求解LCS问题,觉得很赞,但总觉得算导写得有些晦涩,希望自己能写得简单易懂一些,纯当锻炼了,欢迎指导交流。
首先,子序列和子串是不一样的。子串是连续的,而子序列中的元素组成可以是不连续的,但元素的位置下标一定是递增的。以一个字串S = "abcdef"为例,字串S的一个子串是"abc",'cdef'这种连续的,而子序列可以是"abc",也可以是"af ",给人的直观感觉就是用S中的字符拼凑成的,但f一定在a之前。
我们设有两个字符串X和Y,其中,X={x0, x1, x2, ....xi },Y={y0, y1, y2, yj }。用lcs(i , j)表示字符串X与Y的最长公共子序列的长度。
由动态规划思想可知,问题的最优解是由子问题的最优解构成的,所以lcs(i,j) 的值与lcs(i-1, j-1), lcs(i-1, j), lcs(i, j-1) 都有一定的关系。
要确定lcs(i,j)的值,首先比较一下xi, yj 的值,有以下2种情况: