• 51nod 1183


    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1183

    编辑距离,又称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的编辑距离

    Sample Input

    kitten
    sitting

    Sample Output

    3

    题解:

    定义dp[i][j]为把字符串a[0:i-1]改变到字符串b[0:j-1]所需的最少步数(即a[0:i-1]到b[0:j-1]的编辑距离);

    状态转移方程直接看代码即可。

    AC代码:

    #include<bits/stdc++.h>
    using namespace std;
    const int MAX=(int)(1e3+5);
    
    char a[MAX],b[MAX];
    int lena,lenb;
    int dp[MAX][MAX];
    // if(a[i]==b[j]) dp[i][j] = min( dp[i][j-1]+1 , dp[i-1][j]+1 , dp[i-1][j-1] );
    // if(a[i]!=b[j]) dp[i][j] = min( dp[i][j-1]+1 , dp[i-1][j]+1 , dp[i-1][j-1]+1);
    
    int MIN(int a,int b,int c){return min(a,min(b,c));}
    
    int main()
    {
        //freopen("input.txt","r",stdin);
        //freopen("output.txt","w",stdout);
        scanf("%s%s",a,b);
        lena=strlen(a);
        lenb=strlen(b);
    
        //初始化
        for(int i=0;i<=lena;i++) dp[i][0]=i;
        for(int j=0;j<=lenb;j++) dp[0][j]=j;
    
        //状态转移
        for(int i=1;i<=lena;i++)
        {
            for(int j=1;j<=lenb;j++)
            {
                dp[i][j] = MIN(dp[i][j-1]+1, dp[i-1][j]+1, dp[i-1][j-1]+(a[i-1]!=b[j-1]));
            }
        }
    
        printf("%d
    ",dp[lena][lenb]);
    }
  • 相关阅读:
    第二次作业——App案例分析
    第一次作业--四则运算
    一点感想
    结对编程1
    第二次作业
    第一次作业-四则运算
    我的第一篇博客
    第二次作业
    结对编程
    第二次作业 APP分析
  • 原文地址:https://www.cnblogs.com/dilthey/p/8638252.html
Copyright © 2020-2023  润新知