1、dp[0][0]表示str1空的子串編輯成str2空的子串的代價為0
2、矩陣dp第一列即dp[0:m-1][0], dp[i][0] 表示str1[0:i-1]編輯成空串的最小代價,即把str1[0:i-1]中所有字元刪掉的代價,所以dp[i][0] = dc * i
3、矩陣第一行即dp[0][0:n-1], dp[0][j]表示空串編輯成str2[0:j-1]的最小代價,即向空串中新增字元的代價,所以dp[0][j] = ic * j
4、其他位置,從左到右,從上到下計算,dp[i][j]的值可能來自於一下四種情況:
(1)str1[0:i-1]先編輯成str1[0:i-2],即先刪除字元str1[i],然後由str1[0:i-2]編輯成str2[0:j-1],dp[i-1][j] 表示str1[0:i-2]編輯成str[0:j-1]的最小代價,那麼dp[i][j]可能等於dc + dp[i-1][j] (較短的部分已經滿足條件了,則把多餘的刪掉)
(2)str1[0:i-1]可以先編輯成str2[0:j-2],然後向str2[0:j-2]插入字元str2[j-1],編輯成str2[0:j-1],dp[i][j-1]表示str1[0:i-1]編輯成str2[0:j-2]的最小代價,那麼dp[i][[j]可能等於dp[i][j-1] + ic; (長的變成短的已經符合條件了,那變成更長的則需要插入乙個)
(3) 如果str1[i-1] != str2[j-1], 可以先將str1[0:i-2]編輯成str2[0:j-2],然後將str1[i-1]替換成str2[j-1],dp[i-1][j-1]表示將str1[0:i-2]編輯成str2[0:j-2]的最小代價,那麼dp[i][j]可能等於dp[i-1][j-1]+rc
(4)如果str1[i-1] == str2[j-1], 則此時dp[i][j] = dp[i-1][j-1]
def solution5(a, n, b, m, c0, c1, c2):
if n==0 and m == 0:
return 0
elif n ==0:
return c0*m
elif m ==0:
return c1*m
dp = [[0 for i in range(m+1)] for j in range(n+1)]
for i in range(n+1):
dp[i][0] = i * c1
for i in range(m+1):
dp[0][i] = j * c0
for i in range(0, n + 1):
for j in range(0, m + 1):
if a[i - 1] == b[j - 1]:
dp[i][j] = dp[i - 1][j - 1]
else:
dp[i][j] = dp[i - 1][j - 1] +c2
dp[i][j] = min(dp[i][j], dp[i][j-1]+c0)
dp[i][j] = min(dp[i][j], dp[i-1][j]+c1)
return dp[n][m]
演算法 最小編輯距離 動態規劃
給定兩個單詞 word1 和 word2,計算出將 word1 轉換成 word2 所使用的最少運算元 你可以對乙個單詞進行如下三種操作 插入乙個字元 刪除乙個字元 替換乙個字元 示例 1 輸入 word1 horse word2 ros 輸出 3 解釋 horse rorse 將 h 替換為 r ...
動態規劃 編輯距離
1.實踐題目 編輯距離 2.問題描述 設a和b是2個字串。要用最少的字元操作將字串a轉換為字串b。這裡所說的字元操作包括 1 刪除乙個字元 2 插入乙個字元 3 將乙個字元改為另乙個字元。將字串a變換為字串b所用的最少字元運算元稱為字串a到 b的編輯距離,記為d a,b 對於給定的字串a和字串b,計...
動態規劃 編輯距離
給定兩個序列x和y,求從乙個序列到另乙個序列所需變換的最小次數,這裡的變換包括刪除,新增和替換,每次只對乙個元素進行操作。演算法序言 這個題目有點像之前寫的最長公共子串行問題,也是用動態規劃的演算法。能夠應用動態規劃的題目有乙個特點就是具有最優子結構,就是整個問題的最優解會包含子問題的最優解,那麼我...