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

题目:Levenshtein 距离,又称编辑距离,指的是两个字符串之间,由一个转换成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。编辑距离的算法是首先由俄国科学家Levenshtein提出的,故又叫Levenshtein Distance。Ex:字符串A:abcdefg字符串B: abcdef通过增加或是删掉字符”g”的方式达到目的。这两种方案都需要一次操作。把这个操作所需要的次数定义为两个字符串的距离。
要求:
给定任意两个字符串,写出一个算法计算它们的编辑距离。

输入描述:
输入两个字符串
输出描述:
得到计算结果
示例1:
输入
abcdefg
abcdef
输出
1

#include <string>
#include <iostream>
#include <vector>
using namespace std;

//求三个数中的最小值
int min(int a, int b, int c)
{
	int tmp = a<b ? a : b;
	return tmp<c ? tmp : c;
}

int minDistance(string& s1, string& s2)
{
	// word与空串之间的编辑距离为word的长度
	if (s1.empty() || s2.empty()) 
	{
		return max(s1.size(), s2.size());
	}
	int len1 = s1.size();
	int len2 = s2.size();
	// F(i,j)初始化
	vector<vector<int> > f(1 + len1, vector<int>(1 + len2, 0));

	//第一列/第一行分别初始化为0,1,2,3...
	//因为f[i][0]等于i, f[0][j]等于j
	for (int i = 0; i <= len1; ++i) {
		f[i][0] = i;
	}
	for (int i = 0; i <= len2; ++i) {
		f[0][i] = i;
	}

	//计算其它f[i][j]值
	for (int i = 1; i <= len1; i++)
	{
		for (int j = 1; j <= len2; j++)
		{
			int cost = s1[i] == s2[j] ? 0 : 1;//s1[i]==s2[j],说明编辑距离不需要增加
			int deletion = f[i - 1][j] + 1;//s1删除一个字符时,编辑距离需要在上一个基础上加1
			int insertion = f[i][j - 1] + 1;
			int substitution = f[i - 1][j - 1] + cost;
			f[i][j] = min(deletion, insertion, substitution);
		}
	}
	return f[len1][len2];
}

int main() {
	string a, b;
	while (cin >> a >> b)
		cout << minDistance(a, b) << endl;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/lyl194458/article/details/89639880