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驱动爱好者 服务器程序员沟通交流
    如果觉得不错,欢迎点赞,你的鼓励就是我的动力
    阿里打赏 微信打赏
  • 相关阅读:
    021.day21 反射 Class类 反射常用操作
    020.day20 线程概述 多线程优缺点 线程的创建 线程常用方法 生命周期 多线程同步
    019.day19 缓冲流 对象流 标准输入输出流
    018.day18 map集合如何实现排序 File类 IO流 字节流 字符流 编码
    017.day17 Map接口 克隆 treeSet集合排重缺陷
    016.day16 HashSet TreeSet 比较器Comparable Comparator
    015.day15
    014.day14
    013.day13
    线程
  • 原文地址:https://www.cnblogs.com/itdef/p/11630500.html
Copyright © 2011-2022 走看看