二、字串相似度/編輯距離(edit distance)
對於序列s和t,它們之間距離定義為:對二者其一進行幾次以下的操作
(1)刪去乙個字元
(2)插入乙個字元
(3)改變乙個字元
每進行一次操作,計數增加1。將s和t變為同乙個字串的最小計數即為它們的距離。給出相應演算法。
問題分析:
這個問題就不像硬幣找零問題能非常直觀的想到如何分解成規模更小的問題,而且如何表示子問題的結果也是乙個問題。
1. 求問題的最優解:最小的距離
2. 是否有子問題:
1)如果兩個序列的最後乙個元素相同。則s和t的距離等於s-1和t-1的距離。
2)由1)啟發,如果最後乙個元素不同,則d[s][t]=min(d[s-1][t-1), d[s][t-1),d[s-1][t]]+1;
3. 確定最小問題的解。
如果兩個序列有乙個序列長度為0的序列,那麼這兩個序列的距離就是長度不為0序列的長度。如果都為0,則距離為0。
5 從上往下分析問題,從下往上解決問題。
package datastructureandalgorithms;
public class distanceofstrings
if(tlen == 0)
if(s[slen-1] == t[tlen-1])
return min(distance(s, slen-1, t, tlen-1), distance(s, slen, t, tlen-1), distance(s, slen-1, t, tlen)) + 1; }
public static int min(int a, int b, int c){
return a
字串相似度之編輯距離演算法
字串編輯距離 是一種字串之間相似度計算的方法。給定兩個字串s t,將s轉換成t所需要的刪除,插入,替換操作的數量就叫做s到t的編輯路徑。而最短的編輯路徑就叫做字串s和t的編輯距離。舉個例子 s eeba t abac 我們可以按照這樣的步驟轉變 1 將s中的第乙個e變成a 2 刪除s中的第二個e 3...
動態規劃 計算字串編輯距離
題目 設a 和b 是2 個字串。要用最少的字元操作將字串a 轉換為字串b。這裡所說的字元操作包括 1 刪除乙個字元 2 插入乙個字元 3 將乙個字元改為另乙個字元。將字串a變換為字串b 所用的最少字元運算元稱為字串a到b 的編輯距離,記為d a,b 試設計乙個有效演算法,對任給的2 個字串a和b,計...
動態規劃之字串最短編輯距離
題目描述給定兩個字串a和b,現在要將a經過若干操作變為b,可進行的操作有 刪除 將字串a中的某個字元刪除。插入 在字串a的某個位置插入某個字元。替換 將字串a中的某個字元替換為另乙個字元。現在請你求出,將a變為b至少需要進行多少次操作。輸入格式第一行包含整數n,表示字串a的長度。第二行包含乙個長度為...