代码随想录算法训练营第51天 | 115.不同的子序列 、583. 两个字符串的删除操作 、72. 编辑距离
115.不同的子序列
但相对于刚讲过 392.判断子序列,本题 就有难度了 ,感受一下本题和 392.判断子序列 的区别。
https://programmercarl.com/0115.不同的子序列.html
/**
* @param {string} s
* @param {string} t
* @return {number}
*/
var numDistinct = function(s, t) {
if (s.length < t.length) {
return 0;
}
const dp = new Array(s.length + 1).fill(0).map(()=>new Array(t.length + 1).fill(0));
let lens = s.length;
let lent = t.length;
for (let i=0;i<=lens;i++) {
dp[i][0] = 1
}
for (let j=1;j<=lent;j++) {
dp[0][j] = 0;
}
for (let i=1;i<=lens;i++) {
for (let j=1;j<=lent;j++) {
if (s[i-1] === t[j-1]) {
dp[i][j] = dp[i-1][j-1] + dp[i-1][j];
} else {
dp[i][j] = dp[i-1][j];
}
}
}
return dp[lens][lent];
};
- 两个字符串的删除操作
本题和动态规划:115.不同的子序列 相比,其实就是两个字符串都可以删除了,情况虽说复杂一些,但整体思路是不变的。
https://programmercarl.com/0583.两个字符串的删除操作.html
注意dp初始化的值 两种方法
/**
* @param {string} word1
* @param {string} word2
* @return {number}
*/
var minDistance = function(word1, word2) {
const len1 = word1.length;
const len2 = word2.length;
const dp = new Array(len1 + 1).fill(0).map(()=>new Array(len2+1).fill(0));
for (i=1;i<=len1;i++) {
dp[i][0] = i;
}
for (j=1;j<=len2;j++) {
dp[0][j] = j;
}
for (let i=1;i<=len1;i++) {
for (let j=1;j<=len2;j++) {
if (word1[i-1] === word2[j-1]) {
dp[i][j] = dp[i-1][j-1];
} else {
dp[i][j] = Math.min(dp[i-1][j] + 1, dp[i][j-1] + 1);
}
}
}
return dp[len1][len2];
};
/**
* @param {string} word1
* @param {string} word2
* @return {number}
*/
var minDistance = function(word1, word2) {
let len1 = word1.length;
let len2 = word2.length;
const dp = new Array(len1 + 1).fill(0).map(()=>new Array(len2).fill(0));
let max = 0;
for (let i=1;i<=len1;i++) {
for (let j=1;j<=len2;j++) {
if (word1[i-1] === word2[j-1]) {
dp[i][j] = dp[i-1][j-1] + 1;
} else {
dp[i][j] = Math.max(dp[i-1][j], dp[i][j-1]);
}
if (max < dp[i][j]) {
max = dp[i][j];
}
}
}
return len1 + len2 - 2*max;
};
- 编辑距离
最终我们迎来了编辑距离这道题目,之前安排题目都是为了 编辑距离做铺垫。
https://programmercarl.com/0072.编辑距离.html
/**
* @param {string} word1
* @param {string} word2
* @return {number}
*/
var minDistance = function(word1, word2) {
const len1 = word1.length;
const len2 = word2.length;
const dp = new Array(len1 + 1).fill(0).map(()=>new Array(len2 + 1).fill(0));
for (let i=0;i<=len1;i++) {
dp[i][0] = i;
}
for (let j=0;j<=len2;j++) {
dp[0][j] = j;
}
for (let i=1;i<=len1;i++) {
for (let j=1;j<=len2;j++) {
if (word1[i-1] === word2[j-1]) {
dp[i][j] = dp[i-1][j-1];
} else {
dp[i][j] = Math.min(dp[i-1][j] + 1, dp[i][j-1] + 1, dp[i-1][j-1] + 1);
}
}
}
return dp[len1][len2];
};
编辑距离总结篇
做一个总结吧
https://programmercarl.com/为了绝杀编辑距离,卡尔做了三步铺垫.html