个人觉得只要你能明白edit数组的含义就可以理解状态转移方程了。
/*
可以用来表示字符串的相似度?
*/
#include <bits/stdc++.h>
using namespace std;
int edit[100][100] ;//edit(i,j)表示从 A的前i个字符 转化成 B的前j个字符所需的操作次数
int str_equal(char &a,char &b){ //判断两个字符是否相等,相等返回0,否则返回1
return 1^(a==b);
}
int Levenshtein(char *a, char *b ,int al,int bl){ //返回两个字符串的最短编辑距离
memset(edit , 0 , sizeof edit);
edit[0][0] = 0 ;
for (int i = 1 ; i <= al ;i++)
edit[i][0] = i;
for (int j = 1 ; j <= bl ;++j)
edit[0][j] = j;
for (int i = 1 ; i <= al ; ++i)
for (int j = 1 ; j <= bl ;++j){
edit[i][j] = min(min( edit[i][j-1]+1 , edit[i-1][j]+1 ) , edit[i-1][j-1]+str_equal(a[i-1],b[j-1]));//edit(i,j)可由三种状态转变来
//cout<<"i j "<<i<<"-"<<j<<" "<<edit[i][j]<<endl ;
}
return edit[al][bl] ;
}
int main (){
char a[] = "fxpimu" ;
char b[] = "xwrs" ;
//char d='d',e='d';
//cout<<str_equal(d,e);
cout<<Levenshtein(a,b,6,4);
return 0;
}