zoukankan      html  css  js  c++  java
  • P2758 编辑距离

    题目描述

    设A和B是两个字符串。我们要用最少的字符操作次数,将字符串A转换为字符串B。这里所说的字符操作共有三种:

    1、删除一个字符;

    2、插入一个字符;

    3、将一个字符改为另一个字符;

    !皆为小写字母!

    输入输出格式

    输入格式:

    第一行为字符串A;第二行为字符串B;字符串A和B的长度均小于2000。

    输出格式:

    只有一个正整数,为最少字符操作次数。

    输入输出样例

    输入样例#1:
    sfdqxbw                  
    gfdgw
    
    输出样例#1:
    4
    分析:用f[i][j]表示对于s1中前i个字符和s2中前j个字符处理的最优编辑距离。
      当s1[i]==s2[j]时 本步无需处理 f[i][j]=f[i-1][j-1];
      否则 就在三种操作中选最优解
    f[i][j]=minn(f[i-1][j-1],f[i-1][j],f[i][j-1])+1;
                    
     f[i-1][j-1]+1 表示把s1[i]改为s2[j];
                   f[i-1][j]+1 表示删除s1[i];
                   f[i][j-1]+1 表示在s1中插入s2[j];
     


    #include<iostream>
    #include<cstring>
    #include<algorithm>
    #include<cstdio> 
    #include<queue>
    #include<math.h>
    using namespace std;
    int n,m;
    int f[2100][2100];
    char s1[2100],s2[2100];
    int main()
    {
        scanf("%s%s",s1+1,s2+1);
        m=strlen(s1+1);
        n=strlen(s2+1);
        //memset(f,0x7f,sizeof(f));
        for(int i=1;i<=m;i++)    f[i][0]=i;
        for(int i=1;i<=n;i++)    f[0][i]=i;
        
        for(int i=1;i<=m;i++)
        for(int j=1;j<=n;j++)
            if(s1[i]==s2[j])    f[i][j]=f[i-1][j-1];
            else    f[i][j]=min(min(f[i-1][j-1],f[i-1][j]),f[i][j-1])+1;
        cout<<f[m][n];
        return 0;
    }
  • 相关阅读:
    多点触控版的驱动安装
    模板类的继承
    c++大整数运算
    RHEL6单用户模式切换
    Dlna相关开源项目收集整理
    给我的当前RHEL6新增一块硬盘!
    交叉编译libconv
    OSCam学习记录
    Android中的应用!!!!
    Elf文件格式学习笔记
  • 原文地址:https://www.cnblogs.com/CLGYPYJ/p/6957335.html
Copyright © 2011-2022 走看看