最小编辑代价
題目
給定兩個字符str1和str2,再給定三個整數ic,dc,rc,分別代表插入,刪除和替換一個字符的代價,返回將str1編輯成str2的最小代價。
舉例
str1 = “abc”,str2 = “adc”,ic = 5,dc = 3,rc = 100。?
從str1編輯到str2,先刪除’b’,然后插入’d’是代價最小的,所以返回8。
基本思路
如果str1的長度為N,str2的長度為M,生成(N+1)×(M+1)的矩陣dp,為什么N+1,M+1,因為我們需要在字符串的開頭添加一個空字符的特殊情況,dp[i][j]的值代表str1[0…i-1]編輯成str2[0…j-1]的最小代價。dp的計算如下:
矩陣的第一行表示空字符編輯成str2[0…j-1]所需要的最小代價,當然只需要插入操作即可,所以dp[0][j] = ic * j。
矩陣的第一列表示str1[0…i-1]編輯成空字符所需要的最小代價,當然只需要刪除操作即可,所以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]后就不需要進行替換了。
?
?
總結