题目链接
一、思想 – 动态规划 1、二维dp数组dp[i][j]的含义是第一个字符串前i个字符和第二个字符串前j个字符的最大公共子序列
(i , j用来遍历两个字符串的指针)
当不相等的时候,那么dp[i][j]的最大公共子序列,就在dp[i-1][j]和dp[i][j-1]中;再解释一下,假设求x和y的公共子序列,当他们两个的最后一个数相等,那么最后一个数一定在最大公共子序列中,就等于x和y都减去最后一个数的公共子序列。但如果x和y最后一个数不相同,那么如果要求最大公共子序列,最大公共子序列最多只能满足他们俩当中的一个,也就是只会在dp[i-1][j]和dp[i][j-1],因最后一个数不同
dp[i][j] 依赖与 dp[i - 1][j - 1] , dp[i - 1][j], dp[i][j - 1],所以 i 和 j 的遍历顺序肯定是从小到大的。
var longestCommonSubsequence = function(text1, text2) {
const m = text1.length,n = text2.length;
// 1、定义一个二维数组,构成一个矩阵。
// dp[i][j]对应的值就是当前最长公共子序列的长度
const dp = new Array(m + 1).fill(0).map(() => new Array(n + 1).fill(0));
// 2、对矩阵进行行列遍历,不断更新dp数组的值
for(let i=1;i<=m;i++){
for(let j=1;j<=n;j++){
// 取text1和text2中的最后一个数进行比较
const c1 = text1[i-1],c2 = text2[j-1];
if(c1 == c2){
// 不断更新dp数组的值
dp[i][j] = dp[i-1][j-1] + 1;
}else{
dp[i][j] = Math.max(dp[i-1][j],dp[i][j-1]);
}
}
}
// 返回的是最长子序列的长度,就是遍历矩阵到右下角的值。
return dp[m][n];
};
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)