计算字符串距离(编辑距离)
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;
}
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;
}
相关文章推荐
- 字符串相似度计算----编辑距离
- 华为OJ 计算字符串相似度或者编辑距离 JAVA
- 计算两个字符串编辑距离
- 编辑距离 算法详述计算两个字符串差异 c++代码
- 计算字符串的相似度(编辑距离)
- 计算两个字符串的编辑距离的快速算法
- 计算字符串的相似度(编辑距离)
- 《编程之美》- 3.3 - 计算字符串相似度 即 最小编辑距离问题
- 利用编辑距离(Edit Distance)计算两个字符串的相似度
- 字符串编辑距离的计算方法
- 计算字符串的相似度(编辑距离)
- 最小编辑代价&&华为OJ 编辑距离&&计算字符串的相似度
- 利用编辑距离(Edit Distance)计算两个字符串的相似度
- 计算字符串编辑距离
- 字符串编辑距离的计算,及相应操作过程的打印
- 计算字符串的相似度---编辑距离
- 基于动态规划(dynamic programming)的计算两个字符串的编辑距离
- 编辑距离(LD)计算两个字符串相似度
- 计算字符串的相似度(编辑距离)
- 基于编辑距离和最长公共子串计算字符串相似度