字串的編輯距離

2021-07-22 10:33:21 字數 1961 閱讀 6276

題目:對於乙個字串a可以通過增加乙個字元、刪除乙個字元、修改乙個字元,將字串a變成字串b,例如

a= abcddefg

b = abcefg

可以通過a字串刪除兩個dd得到b字串,也可以通過b字串增加dd程式設計a字串,從上面的分析可以知道,增加和刪除的代價必須是相同的,這樣a字串變成b字串的代價和b字串變成a字串的代價才會是相同的,否這可能產生代價不對稱的情況。其實我們可以設定修改和增加(刪除)的代價是不同的,當然也可以認為他們是一樣的。

實際的計算過程可以如下進行:

1)比較a[i]和b[j];

2)如果a[i] == b[j],那麼distance = editdistance(a[i + i], b[j + 1]) + 0;

3)如果a[i] != b[j],那麼可以經過如下操作使得a[i]等於b[j]

a) a[i]前增加b[j],那麼distance = editdistance(a[i], b[j + 1] + insert_cost

b)b[j]前增加a[i],那麼distance = editdistance(a[i + 1], b[j]) + insert_cost

c)刪除a[i],那麼distance = editdistance(a[i + 1], b[j]) + delete_cost

d)刪除b[j],那麼distance = editdistance(a[i], b[j + 1] + delete_cost

e)a[i]變成b[j],那麼distance = editdistance(a[i + 1], b[j + 1] + replace_cost

f)b[j]變成a[i],那麼distance = editdistance(a[i + 1], b[j + 1] + replace_cost

如果insert_cost == delete_cost,那麼a新增字元變成b和b刪除字元變成a是等價的,a[i]變成b[j]與b[j]變成a[i]也是等價的,因此實際需要考慮的代價就是下面3種情況:

i) distance = editdistance(a[i], b[j + 1] + insert_cost(或delete_cost)

ii) distance = editdistance(a[i + 1], b[j] + insert_cost(或delete_cost)

iii)distance = editdistance(a[i + 1], b[j + 1] + replace_cost

如果我們回顧一下最長公共子串行問題(lcs),就會發現這個問題和lcs問題幾乎是等價的。因為可以這樣理解,找出a和b的lcs,保持lcs對齊不變,增加刪除一些字元就完成了變換,而這樣的代價應該是最小的(猜測的,沒有證明)

這樣乙個問題,我們可以使用遞迴來解決。

當然的解決方案是用動態規劃的方法解決,採用動態規劃解決時,我們假設前面字串都已經變換相同了,那麼在a[i]變成b[j]的過程中需要對比如下代價:

1)如果a[i] == b[j],那麼前面的狀態可能是a[i - 1] b[j - 1]或者 a[i - 1] b[j]或者a[i] b[j - 1],我們要比較這些可能的轉換過程中哪個代價更小;

2)如果a[i] != b[j],那麼:

i)a[i] b[j]可能從a[i - 1] b[j - 1]狀態通過replace a[i] to a[j] + replace的代價來實現;

ii)a[i] b[j]可能從a[i ] b[j - 1]狀態通過為a[i]前面新增乙個b[j -1] + insert的代價來實現;

iii)a[i] b[j]可能從a[i  - 1] b[j]狀態通過刪除a[i - 1] + delete的代價來實現;

而這些代價就通過乙個向量cost向量來儲存。

程式**如下:

#include #include #include using namespace std;

int main ()}}

cout<<'1'<<'/'<<(dp[len1][len2]+1)<

編輯字串距離

題目 題意 編輯距離,又稱levenshtein距離 也叫做edit distance 是指兩個字串之間,由乙個轉成另 乙個所需的最少編輯操作次數。許可的編輯操作包括將乙個字元替換成另乙個字元,插入乙個字元,刪 除乙個字元。例如將kitten轉化成sitting sitten k s sittin ...

字串編輯距離

題目描述 給定乙個源串和目標串,能夠對源串進行如下操作 在給定位置上插入乙個字元 替換任意字元 刪除任意字元 寫乙個程式,返回最小運算元,使得對源串進行這些操作後等於目標串,源串和目標串的長度都小於2000。關於字串最短編輯距離的解題思路 給定相關資料的定義 mep i j 表示源字串source ...

字串編輯距離

給出兩個單詞word1和word2,寫乙個函式計算出將word1 轉換為word2的最少操作次數。你總共三種操作方法 1 插入乙個字元 2 刪除乙個字元 3 替換乙個字元 格式 輸入行輸入兩個字串 word1 和 word2,最後輸出將 word1 轉換為 word2的最少操作次數 樣例輸入 wor...