题目链接:https://ac.nowcoder.com/acm/contest/327/G
题目描述
一天,处女座在牛客算法群里发了一句“我好强啊”,引起无数的复读,可是处女座发现复读之后变成了“处女座好强啊”。处女座经过调查发现群里的复读机都是失真的复读机,会固定的产生两个错误。一个错误可以是下面的形式之一:
1.将任意一个小写字母替换成另外一个小写字母
2.在任意位置添加一个小写字母
3.删除任意一个字母
处女座现在在群里发了一句话,他收到了一个回应,他想知道这是不是一个复读机。
思路:动态规划。dp[i][j]代表从s[1...i]变为t[1...j]需要改动的次数。
初始化dp[][] for(int i=0;i<=ss;i++) dp[i][0]=i; for(int i=0;i<=tt;i++) dp[0][i]=i;(输入s和t的时候从1开始)
若s[i]==t[j] 则dp[i][j]=dp[i-1][j-1];
若s[i]!=t[j],分为三种情况:
1、替换,则dp[i][j]=dp[i-1][j-1]+1;
2、删除,则dp[i][j]=dp[i][j-1]+1;
3、增加,则dp[i][j]=dp[i-1][j]+1;
最后判断一下dp[ss][tt]<=2则成立。
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=110;
int dp[maxn][maxn];
char s[maxn],t[maxn];
int main()
{
while(cin>>s+1>>t+1)//从下标1开始输入
{
int ss=strlen(s+1);//从下标1开始取长度
int tt=strlen(t+1);
for(int i=0;i<=ss;i++) dp[i][0]=i;//初始化
for(int i=0;i<=tt;i++) dp[0][i]=i;
for(int i=1;i<=ss;i++){//从1开始,方便计算i-1=0时
for(int j=1;j<=tt;j++){
if(s[i]==t[j]) dp[i][j]=dp[i-1][j-1];//不变
else dp[i][j]=min(dp[i-1][j]+1,min(dp[i][j-1]+1,dp[i-1][j-1]+1));//分别是增、删、改
}
}
puts(dp[ss][tt]<=2?"YES":"NO");
}
}