動態規劃之最小編輯距離

2021-09-26 11:11:16 字數 1545 閱讀 8955

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,求從乙個序列到另乙個序列所需變換的最小次數,這裡的變換包括刪除,新增和替換,每次只對乙個元素進行操作。演算法序言 這個題目有點像之前寫的最長公共子串行問題,也是用動態規劃的演算法。能夠應用動態規劃的題目有乙個特點就是具有最優子結構,就是整個問題的最優解會包含子問題的最優解,那麼我...