编辑距离: Edit Distance,又称Levenshtein距离,是指一个字符串经过增加、删除、修改后操作转变成另一个字符串所需要的最小操作次数。
相似度:等于“编辑距离+1”的倒数。所以编辑距离越小,相似度越大。
如s1 = “abc”,s2 = “ab”,其编辑距离为1,相似度为1/(1+1) = 0.5
问题:给定两个字符串,计算其相似度
解决方法:利用动态规划,先计算两个字符串的编辑距离,相似度也就很容易的得出来了
#include <iostream>
#include <string.h>
#include <math.h>
using namespace std;
int main()
{
string s, t;
cin >> s;
cin >> t;
int len_s = s.length();
int len_t = t.length();
int dp[len_s+1][len_t+1] = {0};
//预处理、初始化
for(int i = 0; i <= len_s; ++i){
dp[i][0] = i;
}
for(int i = 0; i <= len_t; ++i){
dp[0][i] = i;
}
for(int i = 1; i <= len_s; ++i){
for(int j = 1; j <= len_t; ++j){
if(s[i-1] == t[j-1]){
dp[i][j] = dp[i-1][j-1];
}
else{
dp[i][j] = 1 + min(dp[i-1][j-1], min(dp[i-1][j], dp[i][j-1]));
}
cout << dp[i][j] << endl;
}
}
int editDist = dp[len_s][len_t];
double similarity = 1.0/(editDist+1);
cout << similarity << endl;
return 0;
}