mirror of
https://github.com/krahets/hello-algo.git
synced 2026-07-11 06:56:06 +00:00
build
This commit is contained in:
@@ -9,10 +9,10 @@ comments: true
|
||||
!!! question
|
||||
|
||||
Даны две строки $s$ и $t$ . Верните минимальное число шагов редактирования, необходимое для преобразования $s$ в $t$ .
|
||||
|
||||
|
||||
Для строки допускаются три операции редактирования: вставка одного символа, удаление одного символа и замена одного символа на произвольный другой символ.
|
||||
|
||||
Как показано на рисунке 14-27, для преобразования `kitten` в `sitting` требуется 3 шага редактирования: 2 операции замены и 1 операция вставки; для преобразования `hello` в `algo` также требуется 3 шага: 2 замены и 1 удаление.
|
||||
Как показано на рисунке 14-27, для преобразования `kitten` в `sitting` требуется 3 шага редактирования: 2 операции замены и 1 операция вставки. Для преобразования `hello` в `algo` также требуется 3 шага: 2 замены и 1 удаление.
|
||||
|
||||
{ class="animation-figure" }
|
||||
|
||||
@@ -34,7 +34,7 @@ comments: true
|
||||
|
||||
На каждом раунде решение состоит в выполнении одной операции редактирования над строкой $s$ .
|
||||
|
||||
Нам нужно, чтобы в ходе выполнения операций размер задачи постепенно уменьшался; только тогда можно строить подзадачи. Пусть длины строк $s$ и $t$ равны соответственно $n$ и $m$ ; сначала рассмотрим последние символы этих строк, то есть $s[n-1]$ и $t[m-1]$ .
|
||||
Нам нужно, чтобы в ходе выполнения операций размер задачи постепенно уменьшался. Только тогда можно строить подзадачи. Пусть длины строк $s$ и $t$ равны соответственно $n$ и $m$. Сначала рассмотрим последние символы этих строк, то есть $s[n-1]$ и $t[m-1]$ .
|
||||
|
||||
- Если $s[n-1]$ и $t[m-1]$ совпадают, их можно просто пропустить и сразу перейти к сравнению $s[n-2]$ и $t[m-2]$ .
|
||||
- Если $s[n-1]$ и $t[m-1]$ различны, нужно выполнить над $s$ одну операцию редактирования (вставку, удаление или замену), чтобы последние символы стали одинаковыми, после чего можно перейти к задаче меньшего размера.
|
||||
@@ -49,9 +49,9 @@ comments: true
|
||||
|
||||
Рассмотрим подзадачу $dp[i, j]$ . Ее последние символы - это $s[i-1]$ и $t[j-1]$ . В зависимости от операции редактирования возможны три случая, показанные на рисунке 14-29.
|
||||
|
||||
1. Вставить после $s[i-1]$ символ $t[j-1]$ ; тогда остается подзадача $dp[i, j-1]$ .
|
||||
2. Удалить $s[i-1]$ ; тогда остается подзадача $dp[i-1, j]$ .
|
||||
3. Заменить $s[i-1]$ на $t[j-1]$ ; тогда остается подзадача $dp[i-1, j-1]$ .
|
||||
1. Вставить после $s[i-1]$ символ $t[j-1]$. Тогда остается подзадача $dp[i, j-1]$ .
|
||||
2. Удалить $s[i-1]$. Тогда остается подзадача $dp[i-1, j]$ .
|
||||
3. Заменить $s[i-1]$ на $t[j-1]$. Тогда остается подзадача $dp[i-1, j-1]$ .
|
||||
|
||||
{ class="animation-figure" }
|
||||
|
||||
@@ -535,7 +535,7 @@ $$
|
||||
|
||||
Поскольку $dp[i,j]$ зависит от значения сверху $dp[i-1, j]$ , слева $dp[i, j-1]$ и слева сверху $dp[i-1, j-1]$ , прямой обход после оптимизации памяти теряет значение слева сверху, а обратный обход не позволяет заранее построить значение слева $dp[i, j-1]$ . Значит, оба наивных варианта обхода здесь непригодны.
|
||||
|
||||
Чтобы решить эту проблему, можно использовать переменную `leftup` для временного сохранения значения слева сверху $dp[i-1, j-1]$ ; после этого остается учитывать только верхнее и левое значения. Тогда ситуация становится аналогичной задаче о полном рюкзаке, и можно выполнять прямой обход. Код приведен ниже:
|
||||
Чтобы решить эту проблему, можно использовать переменную `leftup` для временного сохранения значения слева сверху $dp[i-1, j-1]$. После этого остается учитывать только верхнее и левое значения. Тогда ситуация становится аналогичной задаче о полном рюкзаке, и можно выполнять прямой обход. Код приведен ниже:
|
||||
|
||||
=== "Python"
|
||||
|
||||
|
||||
Reference in New Issue
Block a user