在最长公共子序列(一)里实际上做的是最长公共子串问题,而最长公共子序列实际上子串的字符在原串中是可以不连续的。例如:
str1=”1A2C3D4B56”,str2=”“B2D23CA45B6A
“123456”和”12C4B6”都是最长公共子序列。
1.分析
还是用动态规划去解决,因为这个问题符合DP的两个性质:重叠子问题和最优子结构。使用动态规划表存储子问题的最优解,分析如下:
对于两个长度分别为M和N的字符串 s1 和 s2 ,首先生成 M×N 的矩阵 dp[M][N] , dp[i][j] 的含义是 s1[0...i] 和 s2[0...j] 的公共子序列的长度。
1.1 初始化
首先初始化第一列和第一行,第一列 dp[M−1][0] 的含义是 s1[0...M−1] 与 s2[0] 的最长公共子序列的长度。根据 dp 矩阵的定义,若 s1[i]==s2[0]