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

    基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题
     收藏
     关注
    编辑距离,又称Levenshtein距离(也叫做Edit Distance),是指两个字串之间,由一个转成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。
    例如将kitten一字转成sitting:
    sitten (k->s)
    sittin (e->i)
    sitting (->g)
    所以kitten和sitting的编辑距离是3。俄罗斯科学家Vladimir Levenshtein在1965年提出这个概念。
    给出两个字符串a,b,求a和b的编辑距离。
    Input
    第1行:字符串a(a的长度 <= 1000)。
    第2行:字符串b(b的长度 <= 1000)。
    Output
    输出a和b的编辑距离
    Input示例
    kitten
    sitting
    Output示例
    3


    分析:对于两个字符串s和t,dp[i][j]记录s的前i个字符转换到t的前j个字符的最小编辑距离。那么很容易得到转移方程 dp[i][j] = min(dp[i][j], dp[i-1][j-1] + s[i-1] == t[j-1] ? 0 : 1)。对每个dp[i][j],我们考虑直接从dp[i-1][j]或dp[i][j-1]加一个字符,所以初始为dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + 1。对于dp[0][i]和dp[i][0],显然都等于i。


    #include <iostream>
    #include<stdio.h>
    #include<string.h>
    using namespace std;
    
    const int N=1e3+5;
    int T,cas=0;
    int n,m;
    int dp[N][N];
    char s[N],t[N];
    
    
    int main()
    {
        while(scanf("%s%s",s,t)!=EOF)
        {
            int n=strlen(s),m=strlen(t);
            for(int i=0;i<=n;i++)
                dp[i][0]=i;
            for(int i=0;i<=m;i++)
                dp[0][i]=i;
                for(int i=1;i<=n;i++)
                {
                    for(int j=1;j<=n;j++)
                    {
                        dp[i][j]=min(dp[i-1][j],dp[i][j-1])+1;
                        dp[i][j]=min(dp[i][j],dp[i-1][j-1]+(s[i-1]!=t[j-1]));
                    }
                }
                printf("%d
    ",dp[n][m]);
        }
        return 0;
    }
    











  • 相关阅读:
    树莓派研究笔记(2)-- 安装Nginx 服务器,PHP 和 SQLite
    树莓派研究笔记(1)-- 安装Mono
    Qemu虚拟机 玩树莓派最新版系统 (截止2017-04-10)
    CLRInjection
    CLRMonitor
    Xamarin Mono for VS开发窗体标题(Title)乱码解决方案
    精美3D中国象棋
    怀旧系列(5)----大学时代的疯狂
    怀旧系列(4)----文曲星编程GV-Basic
    怀旧系列(3)----Pascal
  • 原文地址:https://www.cnblogs.com/bryce1010/p/9387099.html
Copyright © 2011-2022 走看看