码迷,mamicode.com
首页 > 其他好文 > 详细

编辑距离

时间:2014-07-31 20:12:47      阅读:226      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   os   strong   io   for   

编辑距离概念描述:

编辑距离,又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。

例如将kitten一字转成sitting:

  1. sitten (k→s)
  2. sittin (e→i)
  3. sitting (→g)

俄罗斯科学家Vladimir Levenshtein在1965年提出这个概念。

 

问题:找出字符串的编辑距离,即把一个字符串s1最少经过多少步操作变成编程字符串s2,操作有三种,添加一个字符,删除一个字符,修改一个字符

 

解析:

首先定义这样一个函数——edit(i, j),它表示第一个字符串的长度为i的子串到第二个字符串的长度为j的子串的编辑距离。

显然可以有如下动态规划公式:

  • if i == 0 或 j == 0,edit(i, j) = i + 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。
#include <iostream>
#include <string>
#include <vector>
#include <stdio.h>

using std::cout;
using std::endl;
using std::vector;
using std::string;

int min(int a, int b)
{
    return a < b ? a : b;
}

int edit(string src, string dst)
{
    vector<vector<int>> distances;
    for (int i = 0; i <= src.size(); i++)
    {
        distances.push_back(vector<int>(dst.size() + 1));
    }
    for (int i = 0; i < distances.size(); i++)
    {
        distances[i][0] = i;
    }
    for (int i = 0; i < distances[0].size(); i++)
    {
        distances[0][i] = i;
    }
    for (int i = 1; i < distances.size();i++)
    {
        for (int j = 1; j < distances[i].size(); j++)
        {
            int sub = 0;
            if (src[i - 1] == dst[j - 1])
            {
                sub = 0;
            }
            else
            {
                sub = 1;
            }
            distances[i][j] = min(min(distances[i][j - 1] + 1, distances[i - 1][j] + 1), distances[i - 1][j - 1] + sub);
        }
    }
    printf("    ");
    for (int i = 0; i < dst.size(); i++)
    {
        printf("%2c", dst[i]);
    }
    printf("\n");
    for (int i = 0; i < distances.size(); i++)
    {
        printf("%2c", i != 0 ? (src[i - 1]) :  );
        for (int j = 0; j < distances[i].size(); j++)
        {
            printf("%2d", distances[i][j]);
        }
        printf("\n");
    }
    cout << endl;
    return distances[distances.size() - 1][distances[0].size() - 1];
}

int main(void)
{
    string str1 = "kitten";
    string str2 = "sitting";

    int r = edit(str1, str2);
    cout << "the distance is : " << r << endl;
    getchar();
    return 0;
}

 

运行结果:

bubuko.com,布布扣

编辑距离,布布扣,bubuko.com

编辑距离

标签:style   blog   http   color   os   strong   io   for   

原文地址:http://www.cnblogs.com/liuzhijiang123/p/3881271.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!