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