-
定义
编辑距离又称Leveinshtein距离,是由俄罗斯科学家Vladimir Levenshtein在1965年提出。编辑距离是计算两个文本相似度的算法之一,以字符串为例,字符串a和字符串b的编辑距离是将a转换成b的最小操作次数,这里的操作包括三种:
插入一个字符
删除一个字符
替换一个字符例如:将qwer转化成awdrf
我们将 q -->>a, e -->>d,+f,所以编译距离是3。 -
作用
根据定义,两个字符串编译距离越小,他们就越相似,所以我们经常使用编译距离来进行模糊匹配,当编译距离小于一定的值的时候,我们就认为他们是近似的。 -
代码实现
我们主要使用动态规划来实现代码
假设我们要将计算s1转换成s2的编译距离
分析过程:
1,状态:我们建立一个dp[i] [j]来记录 i表示s1的第i位,j表示s2的第i位。而dp数组表示第i 第j前面(包括第i第j)最少进行了几次操作。
2,转化方程:
(1)当s1[I] = s2[j] 的时候就表示当前不需要操作 所以dp[i][j] = dp[i - 1][j - 1]
(2)当s1[I] != s2[j]的时候,我们可以进行修改,所以dp[i][j] = dp[i - 1][j - 1]
(3)当s1的第i 位和s2的第j - 1位对齐时,我们就可以在当前位置进行一次添加,所以dp[i][j] = dp[i ][j - 1] + 1;
(4)当s1的前i - 1位和s2的前j位对齐时,我们可以在当前位置进行一次删除,所以dp[i][j] = dp[i - 1][j] + 1;所以最终的转化方程为:
当s1[I] = s2[j]时 ,dp[i][j] = dp[i - 1][j - 1]
当s1[I] != s2[j]时,dp[i][j] = min(min(dp[i - 1][j], dp[i][j - 1]),dp[i - 1][j - 1]) + 1;
代码如下
#include<iostream>
#include<string>
using namespace std;
const int N = 100;
int dp[N][N];
string a,b;
int main(){
cin >> a >> b;
int lena = a.size();
int lenb = b.size();
for(int i = 1; i <= lena; i++) {
dp[i][0] = i;
}
for(int i = 1; i <= lenb; i++) {
dp[0][i] = 1;
}
for(int i = 1; i <= lena; i++) {
for(int j = 1; j <= lenb; j++) {
if(a[i] == b[j]){
dp[i][j] = dp[i - 1][j - 1];
} else {
dp[i][j] = min(min(dp[i - 1][j], dp[i][j - 1]),dp[i - 1][j - 1]) + 1;
}
}
}
cout << dp[lena][lenb] << endl;
}