字符串a,长度为m:a[1].a[2].a[3].a[4]....a[m]
字符串b,长度为n:b[1].b[2].b[3].b[4]....b[n]
比如字符串a:BDCABA;字符串b:ABCBDAB,字符串a、b的最长公共子序列长度为4,最长公共子序列是:BCBA或者BDAB,子序列可以不用连续
1.求字符串a(0~m)和b(0~n)的最长公共子序列:如果a[m]等于b[n],问题是不是转化为求a(0~m-1)和b(0~n-1)的最长公共子序列(再加上a[m]或者b[n]的这个字符),最长公共子序列的长度用dp[m-1][n-1]+1表示;同样的,如果a[m-1]等于b[n-1],问题转化为求a(0~m-2)和b(0~n-2)的最长公共子序列+2,用dp[m-2][n-2]+2表示;
2.如果a[m]不等于b[n],说明最后一个元素不可能是最长公共子序列中的元素(最后一个字符都不相等了,所以就不可能公共了),那对于最长公共子序列来说,可能是a[m-1]和b[n]的最长公共子序列或者a[m]和b[n-1]的最长公共子序列;同理要判断a[m-1]和b[n],如果a[m-1]和b[n]不相等,那继续递推a[m-1]、b[n-1]和a[m-2]、b[n];a[m]和b[n-1]是不是相等,如果a[m]和b[n-1]不相等,那继续递推a[m-1]、b[n-1]和a[m]、b[n-2];
.......
3.如果m=0,也即字符串a的长度是0,不管字符串b的情况怎样,那最长公共子序列肯定是0,记d[0][n]=0;同理,b字符串的长度为0时,d[m][0]=0;
即 if(a[m]==b[n]) dp[m][n] = dp[m-1][n-1]+1;
if(a[m]!=b[n]) dp[m][n] = max{dp[m-1][n], dp[m][n-1]};
if(m==0||n==0) dp[m][n]=0;
4.构建二维数组,dp[m][n]的值就是要求的最长公共子序列长度,如下图中的dp[6][7]=4
5.同样,根据上图,找到最长公共子序列BCBA或者BDAB