72. Edit Distance
題目網址:https://leetcode.cn/problems/edit-distance/
題意:給兩 string
word1和word2, 返回將word1轉換成word2的最少操作數。可對單字進行以下操作:
- 插入一個 char
- 刪除一個 char
- 替換一個 char
!https://i.imgur.com/Lw9oEAc.png
Solution:
想法:利用 DP
1. 定義狀態:
dp[i][j]:word1[1:i]轉換成word2[1:j]的最少操作數2. 得到轉移方程:
若
word1[i] == word2[j], 則問題變成word1[1:(i-1)]轉換成word2[1:(j-1)]的最少操作數
➔dp[i][j] = dp[i - 1][j - 1]否則, 有三種情況:
word1[1:i]插入word2[j], 則問題變成word1[1:i]轉換成word2[1:(j-1)]的最少操作數 + 1(+1 是因為插入操作)
➔dp[i][j] = dp[i][j - 1] + 1
word1[1:i]刪除word1[i], 則問題變成word1[1:(i-1)]轉換成word2[1:j]的最少操作數 + 1(+1 是因為刪除操作)
➔dp[i][j] = dp[i - 1][j] + 1
word1[1:i]替換word1[i]成word2[j], 則問題變成word1[1:(i-1)]轉換成word2[1:(j-1)]的最少操作數 + 1(+1 是因為替換操作)
➔dp[i][j] = dp[i - 1][j - 1] + 1➔
dp[i][j]為以上三種情況取最小的3. 初始化:
dp[i][0]:當word2 = ""時,word1[1:i]必須刪除所有的 char 才會匹配word2, 所以word1[1:i]必須進行i次刪除操作(因為有i個 char)
➔dp[i][0] = i
dp[0][j]:當word1 = ""時,word1必須插入word2[1:j]中所有的 char 才會匹配word2[1:j], 所以word1必須進行j次插入操作(因為有j個 char)
➔dp[0][j] = j
class Solution { |
- time:$O(m \cdot n)$ ➔ for loop
- space:$O(m \cdot n)$ ➔
dp