这是典型的动态规划,两个字符串 str1=a1,a2……,an, str2=b1,b2,……,bm;
如果用dp[i][j]表示str1的前 i 个字符 和str2的前 j 个字符的最大公共子序列的长度,那么dp[n][m]就是要求的结果,但这种方法的空间复杂度是o(nm),但其实每次要用到的只是上一行的结果,所以空间复杂度可以优化为 o(min{n,m}).
这里设 vecOrignal 为上一行的结果,初始化为全零,vec 为当前行的结果,
那么比较str1 的前 i 个字符和 str2 的前 j 个字符时, 我们知道递推公式为
若 str1[ i ] = str2[ j ] ,
vec[ j ] = vecOrignal [j-1] + 1; 如果当前的两个字符相等的话,那么两个字符串都向前移动一位,结果加1, 此时再比较 str1的前 i-1个字符和 str2 的前 j-1个字符
否则, vec[j] = max{ vec[ j-1 ], vecOrignal [j] };
vec[j-1]相当于 str2 前移动一位,此时再比较 str1的前 i 个字符和 str2 的前 j-1个字符
vecOrignal[ j ] 相当于str1 前移动一位,此时再比较 str1的前 i-1 个字符和 str2 的前 j 个字符
dist[i][j] 用来记录 比较 str[ i ] 和 str2[ j ] 时来自哪两个字符比较的结果,为 1 代表 str[ i ] 和 str2[ j ] 相等,记录此字符,
为 2 表示 来自