編輯距離概念描述:
編輯距離,又稱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 ...