最小编辑代价
題目
給定兩個(gè)字符str1和str2,再給定三個(gè)整數(shù)ic,dc,rc,分別代表插入,刪除和替換一個(gè)字符的代價(jià),返回將str1編輯成str2的最小代價(jià)。
舉例
str1 = “abc”,str2 = “adc”,ic = 5,dc = 3,rc = 100。?
從str1編輯到str2,先刪除’b’,然后插入’d’是代價(jià)最小的,所以返回8。
基本思路
如果str1的長度為N,str2的長度為M,生成(N+1)×(M+1)的矩陣dp,為什么N+1,M+1,因?yàn)槲覀冃枰谧址拈_頭添加一個(gè)空字符的特殊情況,dp[i][j]的值代表str1[0…i-1]編輯成str2[0…j-1]的最小代價(jià)。dp的計(jì)算如下:
矩陣的第一行表示空字符編輯成str2[0…j-1]所需要的最小代價(jià),當(dāng)然只需要插入操作即可,所以dp[0][j] = ic * j。
矩陣的第一列表示str1[0…i-1]編輯成空字符所需要的最小代價(jià),當(dāng)然只需要?jiǎng)h除操作即可,所以dp[i][0] = dc * i。
矩陣的其他位置來自以下的三種情況:dp[i-1][j]+dc,dp[i][j-1]+ic,(dp[i-1][j-1] or dp[i-1][j-1]+rc)
1)dp[i-1][j] + dc,表示先刪除str1[i-1],然后將str1[0…i-2]編輯成str2[0…j-1]
2)dp[i][j-1] + ic,表示將str1[i-1]編輯成str2[0…j-2],然后再插入str2[j-1]
3)dp[i-1][j-1] or dp[i-1][j-1]+rc,表示如果str1[i-1] != str2[j-1],則先將str1[0…i-2]編輯成str2[0…j-2]再將str1[i-1]替換成str2[j-1],如果str1[i-1] == str2[j-1],則將str1[0…i-2]編輯成str2[0…j-2]后就不需要進(jìn)行替換了。
?
?
總結(jié)