class Solution:
def minDistance(self, word1: str, word2: str) -> int:
big = 10 ** 8
n1 = len(word1)
n2 = len(word2)
dp = [[None for _ in range(n2 + 1)] for _ in range(n1 + 1)]
# dp[n1][n2]
dp[0][0] = 0
# f(x, y) = minimum operation needed to turn first x characters of word1 into first y characters of word2
def f(x, y):
if dp[x][y] is not None:
return dp[x][y]
dp[x][y] = big
# replace or equal
if x > 0 and y > 0:
need_to_replace = 1 if word1[x - 1] != word2[y - 1] else 0
dp[x][y] = min(dp[x][y], need_to_replace + f(x - 1, y - 1))
# insert
if y > 0:
dp[x][y] = min(dp[x][y], 1 + f(x, y - 1))
# delete
if x > 0:
dp[x][y] = min(dp[x][y], 1 + f(x - 1, y))
return dp[x][y]
return f(n1, n2)
Y2xhc3MgU29sdXRpb246CiAgICBkZWYgbWluRGlzdGFuY2Uoc2VsZiwgd29yZDE6IHN0ciwgd29yZDI6IHN0cikgLT4gaW50OgogICAgICAgIGJpZyA9IDEwICoqIDgKICAgICAgICBuMSA9IGxlbih3b3JkMSkKICAgICAgICBuMiA9IGxlbih3b3JkMikKICAgICAgICBkcCA9IFtbTm9uZSBmb3IgXyBpbiByYW5nZShuMiArIDEpXSBmb3IgXyBpbiByYW5nZShuMSArIDEpXQogICAgICAgICMgZHBbbjFdW24yXQoKICAgICAgICBkcFswXVswXSA9IDAKICAgICAgICAKICAgICAgICAjIGYoeCwgeSkgPSBtaW5pbXVtIG9wZXJhdGlvbiBuZWVkZWQgdG8gdHVybiBmaXJzdCB4IGNoYXJhY3RlcnMgb2Ygd29yZDEgaW50byBmaXJzdCB5IGNoYXJhY3RlcnMgb2Ygd29yZDIKICAgICAgICAKICAgICAgICBkZWYgZih4LCB5KToKICAgICAgICAgICAgaWYgZHBbeF1beV0gaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICByZXR1cm4gZHBbeF1beV0KCiAgICAgICAgICAgIGRwW3hdW3ldID0gYmlnCgogICAgICAgICAgICAjIHJlcGxhY2Ugb3IgZXF1YWwKICAgICAgICAgICAgaWYgeCA+IDAgYW5kIHkgPiAwOgogICAgICAgICAgICAgICAgbmVlZF90b19yZXBsYWNlID0gMSBpZiB3b3JkMVt4IC0gMV0gIT0gd29yZDJbeSAtIDFdIGVsc2UgMAogICAgICAgICAgICAgICAgZHBbeF1beV0gPSBtaW4oZHBbeF1beV0sIG5lZWRfdG9fcmVwbGFjZSArIGYoeCAtIDEsIHkgLSAxKSkKICAgICAgICAgICAgCiAgICAgICAgICAgICMgaW5zZXJ0CiAgICAgICAgICAgIGlmIHkgPiAwOgogICAgICAgICAgICAgICAgZHBbeF1beV0gPSBtaW4oZHBbeF1beV0sIDEgKyBmKHgsIHkgLSAxKSkKICAgICAgICAgICAgCiAgICAgICAgICAgICMgZGVsZXRlCiAgICAgICAgICAgIGlmIHggPiAwOgogICAgICAgICAgICAgICAgZHBbeF1beV0gPSBtaW4oZHBbeF1beV0sIDEgKyBmKHggLSAxLCB5KSkKCiAgICAgICAgICAgIHJldHVybiBkcFt4XVt5XQoKICAgICAgICByZXR1cm4gZihuMSwgbjIpCg==