动态规划求解:将字符串A变换为字符串B所用的最少字符操作次数

11 篇文章 10 订阅

问题

问题描述:
设A 和B 是2 个字符串。要用最少的字符操作将字符串A 转换为字符串B。
这里所说的字符操作包括
(1)删除一个字符;
(2)插入一个字符;
(3)将一个字符改为另一个字符。
将字符串A变换为字符串B 所用的最少字符操作次数也称为字符串A到B 的编辑距离,记为 D(A,B)。
试设计一个有效算法,对任给的2 个字符串A和B,计算出它们的编辑距离D(A,B)。

例题分析

先上图:
在这里插入图片描述
该图中示例为字符串“daaqerdwq”转化为字符串“aswdreqew”。
此时我们可以看到位于(1,1)位置的数字1,对应的是字符串“d”转化为字符串“a”互相转化需要的最少步数。最右下角的褐色区域的数字8,代表字符串“daaqerdwq”转化为字符串“aswdreqew”需要的最小步数。

思路

首先假设两个字符串都为空,则需要0步就可以转化。所以表格最左上角要写0,然后字符串A加入一个“d”,此时需要1步才能做到转化,同理,若是B为空字符串,A字符串有几个字符,就需要做几步删除操作。
若是字符串B中有一个字符,如上图中的“a”,重复A字符串从“ ”到“daaqerdwq”不断加入字符的过程,即可得出如下规律

//D[i][j]是指上图中数字区域的每个单元格的值。
D[i][j]=min(min(D[i-1][j]+1,D[i][j-1]+1),(A[j-1]==B[i-1]?D[i-1][j-1]:D[i-1][j-1]+1));

完整代码

#include<iostream>
#include<string>
 
using namespace std;
 
int MinEditDistance(string A,string B)
{
    int len_A = A.length();
    int len_B = B.length();
    int D[len_B+1][len_A+1];
    D[0][0]=0;
    for(int i=1;i<=len_A;i++)
    {
        D[0][i]=i;
    }
    for(int i=1;i<=len_B;i++)
    {
        D[i][0]=i;
    }
    for(int i=1;i<=len_B;i++)
    {
        for(int j=1;j<=len_A;j++)
            D[i][j]=min(min(D[i-1][j]+1,D[i][j-1]+1),(A[j-1]==B[i-1]?D[i-1][j-1]:D[i-1][j-1]+1));
    }
    return D[len_B][len_A];
 
}
 
int main()
{
    string A,B;
    cin>>A>>B;
    cout<<MinEditDistance(A,B);
 
}

转载自:https://blog.csdn.net/ma2413419/article/details/82693319

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值