您的位置:首页 > 其它

计算字符串距离(编辑距离)

2017-03-01 21:07 253 查看
题目:

Levenshtein 距离,又称编辑距离,指的是两个字符串之间,由一个转换成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。编辑距离的算法是首先由俄国科学家Levenshtein提出的,故又叫Levenshtein Distance。

Ex:

字符串A:abcdefg

字符串B: abcdef

通过增加或是删掉字符”g”的方式达到目的。这两种方案都需要一次操作。把这个操作所需要的次数定义为两个字符串的距离。

要求:

给定任意两个字符串,写出一个算法计算它们的编辑距离。
原文参考:http://www.cnblogs.com/ivanyb/archive/2011/11/25/2263356.html

由于文字思路部分copy了别人的文字,但是所以文章决定注明为转载,但是代码是自己原创手打的。关于编辑距离距离算法的应用可以看这篇文章:
http://www.cnblogs.com/Aimeast/archive/2011/09/05/2167844.html
我的代码和上述文章的代码都可以进一步优化以降低空间占用,将二维数组替换为一维数组。优化的思路见文章:
http://www.cnblogs.com/ymind/archive/2012/03/27/fast-memory-efficient-Levenshtein-algorithm.html#3490153
#include<string>

#include<iostream>

#include<vector>

#include<algorithm>

/*

str1或str2的长度为0返回另一个字符串的长度。 if(str1.length==0) return str2.length; if(str2.length==0) return str1.length;

初始化(n+1)*(m+1)的矩阵d,并让第一行和列的值从0开始增长。

扫描两字符串(n*m级的),如果:str1[i-1] == str2[j-1],用temp记录它,为0。否则temp记为1。然后在矩阵d[i,j]赋于d[i-1,j]+1 、d[i,j-1]+1、d[i-1,j-1]+temp三者的最小值。

扫描完后,返回矩阵的最后一个值d
[m]即是它们的距离。

计算相似度公式:1-它们的距离/两个字符串长度的最大值。

*/

using namespace std;

int CalStringDistance(string &str1, string &str2)

{
 int M = str1.size() , N = str2.size();
 //处理边界值
 if ((M - 1) == 0)
 {
     return N - 1;
 }
 if ((N - 1) == 0)
 {
    return M - 1;
 }
 //运用编辑距离算法

 vector<vector<int>> matrix(M+1, vector<int>(N+1, 0));
 for (int i = 0; i <= M; i++)  
 {
    matrix[i][0] = i;//首先处理第一列,设初值
 }
 for (int i = 0; i <= N; i++)
 {
    matrix[0][i] = i;//处理第一行,设初值
 }

 for (int i = 1; i<=M; i++)
 {
   for (int j = 1; j<=N; j++)
   {
     int cost = ((str1[i-1] == str2[j-1]) ? 0 : 1);//根据公式判断左上角的值
     matrix[i][j] = min((matrix[i-1][j]+1) , min((matrix[i][j-1]+1) ,(matrix[i-1][j-1]+cost))); //得到当前位置的值
   }
 }
 return matrix[M]
;

}

int main()

{
  string str1, str2;
  while (cin >> str1 >> str2)
  {
    cout << CalStringDistance(str1, str2) << endl;
  }
  return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息