編輯距離問題(動態規劃)

2021-09-22 19:45:44 字數 1217 閱讀 7614

問題描述:設a和b是兩個字串,要用最少的字元操作將字串a轉換為字串b,這裡所說的字元操作包括(1):刪除乙個字元;(2):插入乙個字元;(3):修改乙個字元。將a轉換為b所用的最少字元運算元稱為a到b的編輯距離,記為d[a][b],d中的a,b指的是a和b的長度,設計乙個演算法對任給的a,b,計算出d[a][b]。

問題舉例:假設a = "fxpimu", b = "xwrs",則d[6][4]為5。

問題分析:這個問題乍一看好像沒什麼突破口,這樣,我們回憶一下01台階問題,到達第i個台階的辦法只有兩種辦法,乙個是跨一步到,乙個是跨兩步到,將這樣的分析思路帶入到這道題中,計算出d[a][b]的途徑有哪幾種,其實就是題目已經告訴的三種:刪除,插入,修改字元,我們一一來看:刪除其實是d[i-1][j]+1(i-1轉換為j-1的編輯距離再加1,這個1是刪除的操作),同理插入可表示為d[i][j-1]+1那修改如何表示呢?我們想象在進行字元操作後(計算d的過程中),i-1和j-1已經完全相等,那麼各給它們兩個後再新增乙個字元,那麼修改就取決於新增的兩個字元相不相等,如果相等d[i][j] = d[i-1][j-1],如果不相等d[i][j] = d[i-1][j-1]+1(就修改一次)。所以經過分析可以得到遞推表示式:

遞推公式知道後就是**了:

#include int d[100][100] ;

int min(int a, int b)

else

return a ;

}int lenth(char a)

return len ;

}void calculate(char a, char b)

else

printf("d[i-1][j]+1 = %d, d[i][j-1]+1 = %d, d[i][j] = %d\n", d[i-1][j]+1, d[i][j-1]+1, d[i][j]) ;

d[i][j] = min( d[i][j], min( d[i-1][j]+1, d[i][j-1]+1 ) ) ;

printf("%d\n", d[i][j]) ;

} }}int main()

動態規劃 編輯距離問題

設a和b是2個字串。要用最少的字元操作將字串a轉換為字串b。這裡所說的字元操作包括 1 刪除乙個字元 2 插入乙個字元 3 將乙個字元改為另乙個字元。將字串a變換為字串b所用的最少字元運算元稱為字串a到 b的編輯距離,記為d a,b 對於給定的字串a和字串b,計算其編輯距離 d a,b 第一行是字串...

動態規劃之編輯距離問題

由公式可以看出,i 1,j 對應刪除操作,i,j 1 對應插入操作。可以這樣理解,現在耗費了di 1,j步操作將字串a 1,i 1 轉換成了b 1,j 則在將a 1,i 轉換成b 1,j 時,我們可以直接刪掉字元a i 問題變成a 1,i 1 轉換成b 1,j 從而dij就等於di 1,j 1。同理...

動態規劃 編輯距離

1.實踐題目 編輯距離 2.問題描述 設a和b是2個字串。要用最少的字元操作將字串a轉換為字串b。這裡所說的字元操作包括 1 刪除乙個字元 2 插入乙個字元 3 將乙個字元改為另乙個字元。將字串a變換為字串b所用的最少字元運算元稱為字串a到 b的編輯距離,記為d a,b 對於給定的字串a和字串b,計...