Levenshtein距离 -----字符串编辑距离

编辑距离,又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。俄罗斯科学家Vladimir Levenshtein在1965年提出这个概念。

动态规划公式如下:
if i == 0 且 j == 0,edit(i, j) = 0
if i == 0 且 j > 0,edit(i, j) = j
if i > 0 且j == 0,edit(i, j) = i
if i ≥ 1 且 j ≥ 1 ,edit(i, j) == min{ edit(i-1, j) + 1, edit(i, j-1) + 1, edit(i-1, j-1) + f(i, j) },当第一个字符串的第i个字符不等于第二个字符串的第j个字符时,f(i, j) = 1;否则,f(i, j) = 0。

c++实现:

#include <iostream>
#include <string>
using namespace std;
int min(int a, int b)
{
    return a < b ? a : b;
}
int max(int a,int b){
    return a > b ? a : b;
}
int edit(string str1, string str2)
{
    int max1 = str1.size();
    int max2 = str2.size();
    int **ptr = new int*[max1 + 1];
    for(int i = 0; i < max1 + 1 ;i++)
    {
        ptr[i] = new int[max2 + 1];
    }
    for(int i = 0 ;i < max1 + 1 ;i++)
    {
        ptr[i][0] = i;
    }
    for(int i = 0 ;i < max2 + 1;i++)
    {
        ptr[0][i] = i;
    }
    for(int i = 1 ;i < max1 + 1 ;i++)
    {
        for(int j = 1 ;j< max2 + 1; j++)
        {
            int d;
            int temp = min(ptr[i-1][j] + 1, ptr[i][j-1] + 1);
            if(str1[i-1] == str2[j-1])
            {
                d = 0 ;
            }
            else
            {
                d = 1 ;
            }
            ptr[i][j] = min(temp, ptr[i-1][j-1] + d);
        }
    }
    cout << "**************************" << endl;
    for(int i = 0 ;i < max1 + 1 ;i++)
    {
        for(int j = 0; j< max2 + 1; j++)
        {
            cout << ptr[i][j] << " " ;
        }
        cout << endl;
    }
    cout << "**************************" << endl;
    int dis = ptr[max1][max2];
    for(int i = 0; i < max1 + 1; i++)
    {
        delete[] ptr[i];
        ptr[i] = NULL;
    }
    delete[] ptr;
    ptr = NULL;
    return dis;
}
int main(int argc,char *argv[])
{
    string str1 = argv[1];
    string str2 = argv[2];
    int r = edit(str1, str2);
    float like=(float)r/max(str1.size(),str2.size());
    cout << "the distance is : " << r << endl<<"the Similarity degree is : "<<(1-like)<<endl;
    return 0;
}

https://blog.csdn.net/chichoxian/article/details/53944188 基于python的实现

猜你喜欢

转载自blog.csdn.net/w_manhong/article/details/80004801
今日推荐