编辑距离(Levenshtein Distance)

是用来度量两个序列相似程度的指标。通俗地来讲,编辑距离指的是在两个单词w1,w2之间,由其中一个单词w1变为w2所需要的最少单字符编辑操作次数。

当两个字符串都为空串,那么编辑距离为0;
当其中一个字符串为空串时,那么编辑距离为另一个非空字符串的长度;
当两个字符串均为非空时(长度分别为 i 和 j ),取以下三种情况最小值即可:
1、长度分别为 i-1 和 j 的字符串的编辑距离已知,那么加1即可;
2、长度分别为 i 和 j-1 的字符串的编辑距离已知,那么加1即可;
3、长度分别为 i-1 和 j-1 的字符串的编辑距离已知,此时考虑两种情况,若第i个字符和第j个字符不同,那么 加1即可;如果不同,那么不需要加1。
image-20200218144922087.png

xxcxyz 为例,建立一个矩阵,通过矩阵记录计算好的距离,当min(i,j)==0时,levab(i,j)=max(i , j),根据此初始化矩阵的第一行和第一列,然后依据上面的公式可以继续推导出后面的几行。
image-20200218161910264.png

// 编辑距离
template <typename T>
int levenshtein_distance(const T &s1, const T &s2) {
    int m = s1.size();
    int n = s2.size();
  
  	// 如果有一方长度为零则结束
    if (m == 0 || n == 0)
        return 0;
  
    // 长度从1开始,需要两个0来初始化
    m += 1;
    n += 1;
	
  	// 申请内存空间,并强制转为int类型
    int *dp = reinterpret_cast<int *>(malloc(m * n * sizeof(int)));
    int i, j;

  	// 初始化矩阵 第一行 第一列
    for (i = 0; i < m; i++) {
        dp[i * n] = i;
    }
    for (j = 0; j < n; j++) {
        dp[j] = j;
    }
  
  
    for (i = 1; i < m; i++) {
        for (j = 1; j < n; j++) {
            if (s1[i - 1] == s2[j - 1]) { // 如果相等 距离为上一格的距离
                dp[i * n + j] = dp[(i - 1) * n + j - 1];
            } else {  // 如果不等,去插入删除和交换的最小距离
                dp[i * n + j] = 1 + min({dp[i * n + j - 1], dp[(i - 1) * n + j], dp[(i - 1) * n + j - 1]});
            }
        }
    }

    int result = dp[m * n - 1];

    free(dp);  // 释放空间
    return result;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值