最小編輯代價 動態規劃

2021-10-14 16:25:35 字數 1595 閱讀 2367

題目描述

給定兩個字串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...