链接: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就有可能是复读机。
思路:这里就是求一个字符串变为另外一个字符串的最小步数是否小于等于二
参考代码:
#include<algorithm>
#include<iostream>
#include<cstring>
#include<vector>
#include<queue>
#include<cstdio>
#include<stack>
#include<map>
#include<cmath>
#include<set>
#define mm(a,n) memset(a,n,sizeof(a))
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define erp(i,a,b) for(int i=a;i>=b;i--)
#define N 200001
#define ll long long int
using namespace std;
int main()
{
string a,b;
cin>>a>>b;
int n1 = a.size();
int n2 = b.size();
vector<vector<int> >dp(n1 + 1,vector<int>(n2 + 1, 0));
rep(i,1,n1)
dp[i][0] = i;
rep(j,1,n2)
dp[0][j] = j;
rep(i,1,n1)
{
rep(j,1,n2)
{
if(a[i - 1] == b[j - 1])
dp[i][j] = dp[i - 1][j - 1];
else
dp[i][j] = 1 + min(dp[i - 1][j - 1], min(dp[i][j - 1], dp[i - 1][j]));
}
}
if(dp[n1][n2]<=2)
cout<<"YES\n";
else
cout<<"NO\n";
return 0;
}
某学长代码:
#include <bits/stdc++.h>
using namespace std;
#define INF 0x3ffffff
int dp[1005][1005]; /*dp[i][j]表示表示A串从第0个字符开始到第i个字符和B串从第0个
字符开始到第j个字符,这两个字串的编辑距离。字符串的下标从1开始。*/
char a[1005],b[1005]; //a,b字符串从下标1开始
int EditDis()
{
int len1 = strlen(a+1);
int len2 = strlen(b+1);
//初始化
for(int i=1;i<=len1;i++)
for(int j=1;j<=len2;j++)
dp[i][j] = INF;
for(int i=1;i<=len1;i++)
dp[i][0] = i;
for(int j=1;j<=len2;j++)
dp[0][j] = j;
for(int i=1;i<=len1;i++)
{
for(int j=1;j<=len2;j++)
{
int flag;
if(a[i]==b[j])
flag=0;
else
flag=1;
dp[i][j]=min(dp[i-1][j]+1,min(dp[i][j-1]+1,dp[i-1][j-1]+flag));
//dp[i-1][j]+1表示删掉字符串a最后一个字符a[i]
//dp[i][j-1]+1表示给字符串添加b最后一个字符
//dp[i-1][j-1]+flag表示改变,相同则不需操作次数,不同则需要,用flag记录
}
}
return dp[len1][len2];
}
int main(){
scanf("%s",a);
scanf("%s",b);
if(EditDis()<=2) puts("YES");
else puts("NO");
return 0;
}