求编译距离|字符串模糊匹配

本文深入讲解了编辑距离算法,一种用于衡量两个字符串相似度的方法。文章详细解释了算法的定义、作用及其实现过程,通过动态规划的方式计算两字符串间的最小操作次数,包括插入、删除和替换字符。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 定义

    编辑距离又称Leveinshtein距离,是由俄罗斯科学家Vladimir Levenshtein在1965年提出。编辑距离是计算两个文本相似度的算法之一,以字符串为例,字符串a和字符串b的编辑距离是将a转换成b的最小操作次数,这里的操作包括三种:

    插入一个字符
    删除一个字符
    替换一个字符

    例如:将qwer转化成awdrf
    我们将 q -->>a, e -->>d,+f,所以编译距离是3。

  2. 作用
    根据定义,两个字符串编译距离越小,他们就越相似,所以我们经常使用编译距离来进行模糊匹配,当编译距离小于一定的值的时候,我们就认为他们是近似的。

  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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值