Сложность: medium
Если даны две строки s1 и s2, верните наименьшую ASCII-сумму удаленных символов, чтобы сделать две строки равными.
Пример:
Input: s1 = "sea", s2 = "eat"
Output: 231
👨💻 Алгоритм:
1⃣Создайте двумерный массив dp размером (len(s1) + 1) x (len(s2) + 1), где dp[i][j] будет хранить наименьшую ASCII-сумму удаленных символов для первых i символов s1 и первых j символов s2.
2⃣Заполните первую строку и первый столбец массива dp суммами ASCII значений символов, которые необходимо удалить для достижения пустой строки.
3⃣Заполните оставшуюся часть массива dp следующим образом: Если символы s1[i-1] и s2[j-1] равны, dp[i][j] = dp[i-1][j-1]. Иначе, dp[i][j] = min(dp[i-1][j] + ord(s1[i-1]), dp[i][j-1] + ord(s2[j-1])).
😎 Решение:
var minimumDeleteSum = function(s1, s2) {
let dp = Array(s1.length + 1).fill(0).map(() => Array(s2.length + 1).fill(0));
for (let i = 1; i <= s1.length; i++) {
dp[i][0] = dp[i - 1][0] + s1.charCodeAt(i - 1);
}
for (let j = 1; j <= s2.length; j++) {
dp[0][j] = dp[0][j - 1] + s2.charCodeAt(j - 1);
}
for (let i = 1; i <= s1.length; i++) {
for (let j = 1; j <= s2.length; j++) {
if (s1[i - 1] === s2[j - 1]) {
dp[i][j] = dp[i - 1][j - 1];
} else {
dp[i][j] = Math.min(dp[i - 1][j] + s1.charCodeAt(i - 1), dp[i][j - 1] + s2.charCodeAt(j - 1));
}
}
}
return dp[s1.length][s2.length];
};Ставь 👍 и забирай 📚 Базу знаний