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