牛客 处女座与复读机

链接:https://ac.nowcoder.com/acm/contest/327/G
来源:牛客网

一天,处女座在牛客算法群里发了一句“我好强啊”,引起无数的复读,可是处女座发现复读之后变成了“处女座好强啊”。处女座经过调查发现群里的复读机都是失真的复读机,会固定的产生两个错误。一个错误可以是下面的形式之一:

1.       将任意一个小写字母替换成另外一个小写字母

2.       在任意位置添加一个小写字母

3.       删除任意一个字母

处女座现在在群里发了一句话,他收到了一个回应,他想知道这是不是一个复读机。

输入描述:

两行
第一行是处女座说的话s
第二行是收到的回应t
s和t只由小写字母构成且长度小于100

输出描述:

如果这可能是一个复读机输出”YES”,否则输出”NO”
示例1

输入

abc
abcde

输出

YES

说明

abc->abcd->abcde
示例2

输入

abcde
abcde

输出

YES

说明

abcde->abcdd->abcde

备注:

只要能经过两步变换就从s得到t就有可能是复读机。


这题一开始以为是LCS,所以就一直WA,WA到死。
赛后看了一下别人的代码才知道有最小编辑距离这种dp思想。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

int dp[105][105] = {0};
int main(){
    char str[105], ptr[105];
    scanf("%s%s",str+1, ptr+1);
    memset(dp,0,sizeof(dp));
    int i,j;
    for(i=0;str[i];i++)
        dp[i][0] = i;
    for(j=0;ptr[j];j++)
        dp[0][j] = j;
    for(i=1;str[i];i++)
        for(j=1;ptr[j];j++){
            int flag;
            if(str[i]==ptr[j])
                flag=0;
            else 
                flag=1;
            dp[i][j] = min(dp[i-1][j-1]+flag,min(dp[i-1][j],dp[i][j-1])+1);
        }

    if(dp[i-1][j-1] <= 2)
        puts("YES");
    else
        puts("NO");

    return 0;
}
View Code

猜你喜欢

转载自www.cnblogs.com/kongbb/p/10327647.html