動態規劃演算法 最短編輯距離與最長公共子串行

2021-08-20 12:04:05 字數 1530 閱讀 7506

參考:

(一)先談最短編輯距離

問題描述:

編輯距離(edit distance),又稱levenshtein距離,是指兩個字串之間,由乙個轉成另乙個所需的最少編輯操作次數。許可的編輯操作包括將乙個

字元替換

成另乙個字元,

插入乙個字元,

刪除乙個字元。

例如將kitten一字轉成sitting:sitten (k→s)sittin (e→i)sitting (→g)

同樣的,我們定義c[i][j]為字串x(i)向字串y(j)轉換的操作步驟數。

類似的,我們考慮如果

(a). x(i)的最後乙個字元x(i)==y(j)的最後乙個字元y(j)

那麼c[i][j]=c[i-1][j-1];     

因為由定義我們知道c[i-1][j-1]是字串x(i-1)向字串y(j-1)的編輯次數,最後乙個字元相等的話即x(i)==y(j),那麼最後乙個字元無需編輯即完成了字串x(i)向y(j)的編輯。

(b).x(i)的最後乙個字元!=y(j)的最後乙個字元y(j)

這裡又要分三種情況

(1)如果最後乙個字元x(i)需要替換成y(j)話,那麼 c[i][j]=c[i-1][j-1]+1;

(2)如果最後乙個字元x(i)需要刪除的話,那麼     c[i][j]=c[i-1][j]+1;   

因為由定義可知,c[i-1][j]是字串x(i-1)轉換成y(j)所需的操作次數,那麼也就是說在字串x(i-1)已經成功轉換成了y(j),那麼顯然最後乙個字元x(i)需要刪除

(3)如果需要在最後乙個字元x(i)後面新增乙個字元即y(j)的話,那麼c[i][j]=c[i][j-1]+1;

因為由定義知道,c[i][j-1]是字串x(i)轉換成y(j-1)所需的操作次數,想要轉換成y(j)的話,只能增加一步新增字元的操作,即插入字元y(j)

綜上所述:

(a). x(i)的最後乙個字元x(i)==y(j)的最後乙個字元y(j) 那麼

c[i][j]=c[i-1][j-1];  

(b)在

x(i)的最後乙個字元!=y(j)的最後乙個字元y(j)時候,

遞推關係:c[i][j]=min(c[i-1][j],c[i][j-1])+1;

邊界條件:c[i][0]=i,i=1,2,......n

c[0][j]=j,j=1,2,.........m

csdn程式設計挑戰模組有道簡易版的編輯距離問題    

描述如下 :

傳統的編輯距離裡面有三種操作,即增、刪、改,我們現在要討論的編輯距離只允許兩種操作,即增加乙個字元、刪除乙個字元。我們求兩個字串的這種編輯距離,即把乙個字串變成另外乙個字串的最少操作次數。 輸入格式: 多組資料,每組資料兩行,每行乙個字串。每個字串長度不超過1000,只有大寫英文本母組成。 輸出格式: 每組資料輸出一行包含乙個整數,表示需要最少操作的次數。

通過**如下:

#include #include #include int min(int a, int b)

最長公共子串行 

程式設計 C 動態規劃演算法 編輯距離問題

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

動態規劃演算法

一 動態規劃演算法原理 將待求解的問題分解成若干個相互聯絡的子問題,先求解子問題,然後從這些子問題的解得到原問題的解 對於重複出現的子問題,只在第一次遇到的時候對它進行求解,並把答案儲存起來。了不去求解相同的子問題,引入乙個陣列,把所有子問題的解存於該陣列中,這就是動態規劃所採用的基本方法。動態規劃...

動態規劃演算法

動態規劃 通過把原問題分解為相對簡單的子問題來求解複雜問題。動態規劃常常適用於有重疊子問題和最優子結構性質的問題。演算法總體思想 演算法的基本步驟 演算法的基本要素 最優子結構 重疊子問題 備忘錄方法 問題描述 子串行 公共子串行 最長公共子串行 lcs 問題 問題分析 動態規劃求解lcs問題 最長...