解決此問題最好的方法是採用動態規劃的方法。如下:
設str1=「abcd」,str2=「gbcdz」,定義乙個二維陣列d,d[i][j]表示str1中取前i個字元和str2中取前j個字元的最短距離,例如d[3][2]表示「abc」到「gb」的最短距離。
d[i][j]的計算規則有三條:
來自d[i - i][j - 1],即 「str1的前i-1個字元組成的子串」 到 「str2的前j-1個字元組成的子串」 的最小距離,此時如果str1[i] = str2[j],則最短距離不變,否則最短距離加1(即把str1[i]變為str2[j] ),所以d[i][j] = d[i - 1][j - 1] + (str1[i] == str2[j] ? 0 : 1)
來自d[i - 1][j],即 「a的前i-1個字元組成的子串」 到 「b的前j個字元組成的子串」 的編輯距離。此時刪除在a的第i個位置上的字元即可,所以d[i][j] = d[i - 1][j] + 1
來自d[i][j - 1], 即 「a的前i個字元組成的子串」 到 「b的前j-1個字元組成的子串」 的編輯距離。此時在a的子串後面新增乙個字元b[j]即可,所以d[i][j] = d[i][j - 1] + 1
於是狀態轉移方程:d[i][j] = min (d[i - 1][j - 1] + (str1[i] == str2[j] ? 0 : 1) , d[i - 1][j] + 1 , d[i][j - 1] + 1)
例如str1=「abcd」,str2=「gbcdz」的d就為(注意i,j的取值範圍):
動態規劃 計算字串編輯距離
題目 設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的長度。第二行包含乙個長度為...
動態規劃 線性 DP 字串編輯距離
字串編輯距離,即 levenshtein 距離,是 科學家 vladimir levenshtein 提出的概念,是指從乙個字串修改到另乙個字串時,編輯單個字元所需的最少次數,編輯單個字元允許的操作有 替換 插入 刪除。levenshtein 距離一般用來衡量兩個字串的相似度,一般來說,兩個字串的編...