zoukankan      html  css  js  c++  java
  • acwing 902. 最短编辑距离

    地址 https://www.acwing.com/problem/content/904/

    给定两个字符串A和B,现在要将A经过若干操作变为B,可进行的操作有:

    1. 删除–将字符串A中的某个字符删除。
    2. 插入–在字符串A的某个位置插入某个字符。
    3. 替换–将字符串A中的某个字符替换为另一个字符。

    现在请你求出,将A变为B至少需要进行多少次操作。

    输入格式

    第一行包含整数n,表示字符串A的长度。

    第二行包含一个长度为n的字符串A。

    第三行包含整数m,表示字符串B的长度。

    第四行包含一个长度为m的字符串B。

    字符串中均只包含大写字母。

    输出格式

    输出一个整数,表示最少操作次数。

    数据范围

    1n,m1000

    输入样例:
    10 
    AGTCTGACGC
    11 
    AGTAAGTAGGC
    输出样例:
    4

    解法

    动态规划

    f[i][j] 表示 a[1-i]变化到b[1-j]最小的变化次数

    那么首先最容易得到的变化次数就是

    a长度=i  b长度=0

    a长度=0 b长度=0

    f[0][j] 若b为j长度 a为0 则a需要增加j次才能变成b
    f[i][0] 若a为i长度 b为0 则a需要删除i次才能编程b

    接下来进行分析各种情况

    a=i b=j

    1 若 a需要删除最后的字母才能变成b 那么就有了 a[1~i-1] == b[1-j] 的前提

    2 若 a需要最后增加一个字母才能变成b 那么就有了 a[1-i] == b[1-j+1] 的前提

    3 若 a需要改动最后一个字母才能变成b 那么就有了 a[1-i-1] == b[1-j-1] 的前提

    第3种情况中 若 a[i] == b[j] 则 此时的最小操作数就可能等于 dp[i-1][j-1]的操作数

    代码流程就是

     f[i][j] = min(f[i-1][j]+1,f[i][j-1]+1);
                if(a[i] == b[j]) f[i][j] = min(f[i][j],f[i-1][j-1]);
                else f[i][j] = min(f[i][j],f[i-1][j-1]+1);

    全部代码如下

    #include <iostream>
    
    
    using namespace std;
    
    
    const int N = 1010;
    int n,m;
    char a[N],b[N];
    int f[N][N];
    
    //f[i][j] 表示 a[1-i]变化到b[1-j]最小的变化次数
    
    
    int main()
    {
        scanf("%d%s",&n,a+1);
        scanf("%d%s",&m,b+1);
        
        //首先初始化  f[i][0] f[j][0] 
        //f[0][j] 若b为j长度 a为0 则a需要增加j次才能变成b
        //f[i][0] 若a为i长度 b为0 则a需要删除i次才能编程b
        for(int i =0;i <= n;i++) f[i][0] = i;
        for(int i = 0; i <= m;i++) f[0][i] = i;
        
        for(int i =1;i <= n;i++){
            for(int j = 1;j <=m;j++){
                f[i][j] = min(f[i-1][j]+1,f[i][j-1]+1);
                if(a[i] == b[j]) f[i][j] = min(f[i][j],f[i-1][j-1]);
                else f[i][j] = min(f[i][j],f[i-1][j-1]+1);
            }
        }
        
        cout << f[n][m] << endl;
        
        return 0;
    }
    作 者: itdef
    欢迎转帖 请保持文本完整并注明出处
    技术博客 http://www.cnblogs.com/itdef/
    B站算法视频题解
    https://space.bilibili.com/18508846
    qq 151435887
    gitee https://gitee.com/def/
    欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
    如果觉得不错,欢迎点赞,你的鼓励就是我的动力
    阿里打赏 微信打赏
  • 相关阅读:
    CCCallFuncND的void指针的理解
    推荐个结合控件
    C#多线程多参数传递
    ASP.NET使用点聚WebOffice实现文档在线浏览
    mysql——插入、更新、删除数据(示例)
    mysql——查询语句——单表查询——(示例)
    mysql——查询语句——单表查询——(概念)
    mysql——修改表名、修改字段名、修改字段数据类型、增加字段、删除字段、修改字段排列位置、修改存储引擎、删除表(概念)
    mysql——单表查询——分组查询——示例
    python+selenium显示等待、隐式等待和强制等待的区别
  • 原文地址:https://www.cnblogs.com/itdef/p/11630500.html
Copyright © 2011-2022 走看看