編輯距離法

2021-07-05 14:13:02 字數 3062 閱讀 5802

編輯距離概念描述:

編輯距離,又稱levenshtein距離,是指兩個字串之間,由乙個轉成另乙個所需的最少編輯操作次數。許可的編輯操作包括將乙個字元替換成另乙個字元,插入乙個字元,刪除乙個字元。

例如將kitten一字轉成sitting:

sitten (k→s)

sittin (e→i)

sitting (→g)

俄羅斯科學家vladimir levenshtein在2023年提出這個概念。

問題:找出字串的編輯距離,即把乙個字串s1最少經過多少步操作變成程式設計字串s2,操作有三種,新增乙個字元,刪除乙個字元,修改乙個字元

解析:

首先定義這樣乙個函式——edit(i, j),它表示第乙個字串的長度為i的子串到第二個字串的長度為j的子串的編輯距離。

顯然可以有如下動態規劃公式:

0failing

0

s

a

i

l

n

0failing

0012

3456

7s1

a2

i3

l4

n5

計算edit(1, 1),edit(0, 1) + 1 == 2,edit(1, 0) + 1 == 2,edit(0, 0) + f(1, 1) == 0 + 1 == 1,min(edit(0, 1),edit(1, 0),edit(0, 0) + f(1, 1))==1,因此edit(1, 1) == 1。 依次類推:

0failing

0012

3456

7s112

3456

7a2

2i3

l4

n5

edit(2, 1) + 1 == 3,edit(1, 2) + 1 == 3,edit(1, 1) + f(2, 2) == 1 + 0 == 1,其中s1[2] == 'a' 而 s2[1] == 'f'『,兩者不相同,所以交換相鄰字元的操作不計入比較最小數中計算。以此計算,得出最後矩陣為:

0failing

0012

3456

7s112

3456

7a221

2345

6i332

1234

5l443

2123

4n554

3222

3程式(c++):注意二維陣列動態分配和釋放的方法!!

#include #include 

using

namespace

std;

int min(int a, int

b)int edit(string str1, string

str2)

for(int i = 0 ;i < max1 + 1 ;i++)

for(int i = 0 ;i < max2 + 1;i++)

for(int i = 1 ;i < max1 + 1 ;i++)

else

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

cout

<< "

**************************

"<

for(int i = 0 ;i < max1 + 1 ;i++)

cout

<

}cout

<< "

**************************

"<

int dis =ptr[max1][max2];

for(int i = 0; i < max1 + 1; i++)

delete ptr;

ptr =null;

return

dis;

}int main(void

)

執行效果:

編輯距離及編輯距離演算法

編輯距離概念描述 編輯距離,又稱levenshtein距離,是指兩個字串之間,由乙個轉成另乙個所需的最少編輯操作次數。許可的編輯操作包括將乙個字元替換成另乙個字元,插入乙個字元,刪除乙個字元。例如將kitten一字轉成sitting sitten k s sittin e i sitting g 俄...

編輯距離及編輯距離演算法

include include include using namespace std const int max 1001 int maxlen max max int maxlen string str1,string str2 return maxlen len1 len2 int main ...

編輯距離及編輯距離演算法

include include include using namespace std const int max 1001 int maxlen max max int maxlen string str1,string str2 return maxlen len1 len2 int main ...