dp-编辑距离HLG

来源:互联网 发布:mac微信语音导出软件 编辑:程序博客网 时间:2024/05/01 06:01

 

Time Limit: 1000 MS

Memory Limit: 65536 K

编辑距离

 

Total Submit: 225(87 users)

Total Accepted: 110(82 users)

Rating: 

Special Judge: No

 

Description

俄罗斯科学家Vladimir
Levenshtein1965年提出了编辑距离概念。编辑距离,又称Levenshtein距离,是指两个字符串之间,由一个转成另一个所需的最少编辑操作次数。许可的三种编辑操作包括插入一个字符、删除一个字符、将一个字符替换成另一个字符。 

至今,编辑距离一直在相似句子检索的领域中发挥着不可忽视的作用。 

我们不妨来设计一个程序,计算两个字符串的编辑距离。 

Input

输入数据的第一行是一个正整数,表示一共有几组数据。 

每组数据有两行,每行一个字符串。 

每个字符串长度不超过1000 

字符串中只含小写英文字母

Output

对于每组数据,请输出一个整数表示两个字符串的编辑距离。 

每个答案占一行。 

Sample Input

2 

david 

vivian 

abc 

aabbcc 

Sample Output

/*编辑距离动态规划算法思路:1.输入的时候两个字符串都要+1蓝后测试其长度的时候也要+1(特殊点 暂时还没有弄懂到底是什么意识)

2.dp的框架有个初步的设定(从0开始到la长度和lb长度)设定为0123456789.......

3.余下dp的设定.两个for循环开始扫 如果两个字母相同就等于dp[i-1][j-1]不然就是dp[i][j]+1;并且要和左边的上边的+1进行比较取小值*/

 

#include<stdio.h>

#include<string.h>

#include<iostream>

using namespace std;

 

        char a[1005];

        char b[1005];

        int dp[1010][1010];

int main()

{

    int t;

    scanf("%d",&t);

    while(t--)

    {

        scanf("%s%s",a+1,b+1);

        int la=strlen(a+1);

        int lb=strlen(b+1);

        //printf("%c",a[1]);//其实a[1]是才是字符串第一个元素哦.

        for(int i=0;i<=la;i++)//必须是a字符串为行b字符串为列 表示ab的编辑距离.

        dp[i][0]=i;

        for(int j=0;j<=lb;j++)

        dp[0][j]=j;

        for(int i=1;i<=la;i++)

        {

            for(int j=1;j<=lb;j++)

            {

                dp[i][j]=(a[i]==b[j])?dp[i-1][j-1]:dp[i-1][j-1]+1;//至于为什么是相等就等于dp[i-1][j-1]可参考dp后台数据0.0

                dp[i][j]=min(dp[i][j],dp[i][j-1]+1);

                dp[i][j]=min(dp[i][j],dp[i-1][j]+1);//先和哪个比无所谓

            }

        }

       /* for(int i=0;i<=la;i++)

        {

            for(int j=0;j<=lb;j++)

            {

                printf("%d",dp[i][j]);

            }

        }*/

        printf("%d\n",dp[la][lb]);

    }

}


0 0
原创粉丝点击