最小編輯距離

2022-08-03 01:54:08 字數 1496 閱讀 7261

當前狀態一定不能從後面的狀態推出

解dp題步驟

1.定義dp陣列

2.建立狀態轉移方程

3.確定初始狀態

4.驗證(迴圈順序)

對於兩個字串a和b,我們需要進行插入、刪除和修改操作將a串變為b串,定義c0,c1,c2分別為三種操作的代價,請設計乙個高效演算法,求出將a串變為b串所需要的最少代價。

給定兩個字串ab,及它們的長度和三種操作代價,請返回將a串變為b串所需要的最小代價。保證兩串長度均小於等於300,且三種代價值均小於等於100。

測試樣例:"abc",3,"adc",3,5,3,100     返回:8

我的**:

int findmincost(string a, int n, string b, int m, int c0, int c1, int

c2) ;

int tmp = 200

;

for(int i = 0; i <= n; i++)

dp[i][

0] = i*c1;

for(int i = 0; i <= m; i++)

dp[0][i] = i*c0;

for(int i = 1; i <= n;i++)

}return

dp[n][m];

}

思路:1.定義dp陣列:dp[i][j],字串a的前i個字元轉換為b的前j個字元的代價。

2.建立狀態轉移方程

字串a轉換到字串b,分三種情況:

a的前n-1位轉換得到字串b,這時只需要將a的最後一位刪掉即可  dp[i-1][j]+c1

a轉換成字串b的前m-1位,這時只需要新增b的最後一位即可  dp[i][j-1]+c0

a的前n-1位轉換到字串b的前m-1位,這時只需要將a的最後一位修改成b的的最後一位即可。dp[i-1][j-1]+c2

dp[i][j] = min( dp[i-1][j]+c1,min(dp[i][j-1]+c0,dp[i-1][j-1]+c2));

3.確定初始狀態

當i為0時,轉換成b則需要新增,到第j位則新增j位,代價為j * c0

當j為0時,轉換成b則需要刪除,到第j位則刪除j位,代價為i * c1

4.驗證

當第i位和第j位相同的時候則不需要修改,d[i][j] = d[i-1][j-1] 

注意判斷條件,字串下標從0開始。

看到別人的**,對於dp陣列申請了空間,這是乙個好習慣,因為堆空間比棧空間大

**為:

//

申請int **dp = new

int*[n+1

];for(int i=0; i1; ++i)

//釋放:

for(int i=0; i1; ++i) delete

dp[i];

delete dp;

最小編輯距離

題目描述給定兩個字串str1和str2,再給定三個整數ic,dc和rc,分別代表插入 刪除和替換乙個字元的代價,請輸出將str1編輯成str2的最小代價。輸入 abc adc 5,3,2 輸出 2 輸入 abc adc 5,3,100 輸出 8 分析使用動態規劃進行解題,dp i j 表示str1的...

最小編輯距離

dp i j 代表字串word1 0.i 1 與word2 0.j 1 的最小編輯距離。插入舉例 x ex vs y exp 前面的兩個ex都是相同,則編輯距離不變為0,x沒有第三個字元,這裡如果我們插入了乙個字元即可。dp i j dp i j 1 1 刪除舉例 x exp vs y ex 我故意...

NLP 最小編輯距離

最小編輯距離 編輯距離 edit distance 又稱 levenshtein距離,是指兩個字串之間,由乙個轉成另乙個所需的編輯操作次數。最小編輯距離,是指所需最小的編輯操作次數。動態規劃的核心思想是 將待求解的問題分解為若干個子問題 階段 按順序求解子階段,前一子問題的解,為後一子問題的求解提供...