題目描述
給定兩個字串str1和str2,再給定三個整數ic,dc和rc,分別代表插入、刪除和替換乙個字元的代價,請輸出將str1編輯成str2的最小代價。
示例1輸入 「abc」,「adc」,5,3,2
返回值 2
示例2輸入 「abc」,「adc」,5,3,100
返回值 8
備註:1≤|str1|,|str2|≤5000
1≤ic,dc,rc≤10000
這題好難,看了網上各路大神的**最後模仿寫的。
主要建立乙個陣列dp,記錄str1子串轉化為str2子串的最小代價。dp[i][j]表示長度為i的第乙個字串編輯成長度為j的第二個字串消耗的最小代價。
假設str1的長度為len1,str2的長度為len2,首先生成大小為(len1+1)*(len2+1)的矩陣dp,dp[i][j]的值代表str1[0…i-1]編輯成str2[0…j-1]的最小代價。
比如str1=「ab12cd3」,str2=「abcdf」,ic=5,dc=3,rc=2。
如果str1[i-1] == str2[j-1],則只需要將前i-1個字元轉換為前j-1個字元即可,最後乙個字元不動:dp[i][j] = dp[i-1][j-1]
如果str1[i] != str2[j]有三類操作可以使得str1變成str2,取其中的最小值:
1.插入:將i個字串轉變為前j-1個字串在插入第j個字元 dp[i][j-1]+ic
dp[i][j-1]是實現字串str1[0…i-1]轉變為字串str2[0…j-2]的最小代價,再插入乙個字元,就實現str1到str2的轉變。
2.刪除:將i-1個字串轉換為前j個字串刪除第i個字元 dp[i-1][j]+id
dp[i-1][j]是實現字串str1[0…i-2]轉變為字串str2[0…j-1]的最小代價,再刪除乙個字元,就實現str1到str2的轉變。
3.替換:將i-1個字串轉換為前j-1個字串替換掉第i個字元為第j個字元 dp[i-1][j-1]+rc
dp[i-1][j-1]是實現字串str1[0…i-2]轉變為字串str2[0…j-2]的最小代價,再更改乙個字元,就實現str1到str2的轉變。
例如上圖中的第二行第三列的5,
插入操作是將a先轉變成a,代價是dp[1][1]=0,再插入字元b;
刪除操作是將空字串先轉變為ab,代價是dp[0][2]=10,由於原第乙個字串有a,因此需要刪除乙個字元;
替換操作是將空字串先轉變為a,代價是dp[0][1]=5,再將a轉變為b需要替換操作;
c++實現:
#include
#include
class
solution
for(i=
0,j=
0;i<=len1;i++
)//計算第一列,全是刪除操作
for(i=
1;i<=len1;i++
)else}}
return dp[len1]
[len2];}
};
最小編輯代價(動態規劃)
在nowcoder上的題目,原題如下 對於兩個字串a和b,我們需要進行插入 刪除和修改操作將a串變為b串,定義c0,c1,c2分別為三種操作的代價,請設計乙個高效演算法,求出將a串變為b串所需要的最少代價。給定兩個字串a和b,及它們的長度和三種操作代價,請返回將a串變為b串所需要的最小代價。保證兩串...
最小編輯代價(動態規劃)
實現 對於不同的要求,主要是找到求dp i j 的規律。include include include include include include include using namespace std define max length 50 字串的最大長度 求出dp i j 代表從str1 ...
最小編輯代價 動態規劃
對於兩個字串a和b,我們需要進行插入 刪除和修改操作將a串變為b串,定義c0,c1,c2分別為三種操作的代價 給定三種操作代價,字串a和b,求出將a串變為b串所需要的最少代價。保證兩串長度均小於等於300,且三種代價值均小於等於100。測試樣例 5 3 100 abc adc 返回 8 public...