牛客寒假算法基础集训营2 处女座与复读机(模拟 or DP)

处女座与复读机

链接: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就有可能是复读机。

题解:DP是真简单啊嘤嘤嘤 模拟一定要用string写字符串
 1 import java.util.Scanner;
 2  
 3 public class Main { 
 4     static final int maxn = 105;
 5     static int [][] dp = new int[105][105];
 6     static String s,t;
 7     public static void main(String[] args) {
 8         Scanner cin = new Scanner(System.in);
 9         s = cin.next();
10         t = cin.next();
11         int len1 = s.length();
12         int len2 = t.length();
13         for(int i=1;i<=len1;i++)
14             dp[i][0] = i;
15         for(int j=1;j<=len2;j++)
16             dp[0][j] = j;
17         for(int i=1;i<=len1;i++) {
18             for(int j=1;j<=len2;j++) {
19                 if(s.charAt(i-1)==t.charAt(j-1))
20                     dp[i][j] = dp[i-1][j-1];
21                 else
22                     dp[i][j] = Math.min(dp[i][j-1],Math.min(dp[i-1][j],dp[i-1][j-1]))+1;
23             }
24         }
25         if(dp[len1][len2]>2)
26             System.out.println("NO");
27         else
28             System.out.println("YES");
29     }
30 }

官方题解的模拟:

  1 #include <bits/stdc++.h>
  2 using namespace std;
  3 string a,b;
  4  
  5 int main()
  6 {
  7     cin>>a>>b;
  8     if (fabs((int)a.length()-(int)b.length())>2)
  9     {
 10         puts("NO");
 11     }
 12     else
 13     {
 14         if (b.length()==a.length()+2)
 15         {
 16             int can=0;
 17             for (int i=0;i<b.length();i++)
 18             {
 19                 for (int j=i+1;j<b.length();j++)
 20                 {
 21                     string s="";
 22                     for (int k=0;k<b.length();k++)
 23                     {
 24                         if (k!=i && k!=j) s.push_back(b[k]);
 25                     }
 26                     if (a==s) can=1;
 27                 }
 28             }
 29             if (can==1) puts("YES");
 30             else puts("NO");
 31         }
 32         else if ((int)b.length()==(int)a.length()-2)
 33         {
 34             swap(a,b);
 35             int can=0;
 36             for (int i=0;i<b.length();i++)
 37             {
 38                 for (int j=i+1;j<b.length();j++)
 39                 {
 40                     string s="";
 41                     for (int k=0;k<b.length();k++)
 42                     {
 43                         if (k!=i && k!=j) s.push_back(b[k]);
 44                     }
 45                     if (a==s) can=1;
 46                 }
 47             }
 48             if (can==1) puts("YES");
 49             else puts("NO");
 50         }
 51         else if (b.length()==a.length()+1)
 52         {
 53             int can=0;
 54             for (int i=0;i<b.length();i++)
 55             {
 56                 string s="";
 57                 for (int j=0;j<b.length();j++)
 58                 {
 59                     if (j!=i) s.push_back(b[j]);
 60                 }
 61                 int cnt=0;
 62                 for (int i=0;i<a.length();i++)
 63                 {
 64                     if (a[i]!=s[i]) cnt++;
 65                 }
 66                 if (cnt<=1) can=1;
 67             }
 68             if (can==1) puts("YES");
 69             else puts("NO");
 70         }
 71         else if ((int)b.length()==(int)a.length()-1)
 72         {
 73             swap(a,b);
 74             int can=0;
 75             for (int i=0;i<b.length();i++)
 76             {
 77                 string s="";
 78                 for (int j=0;j<b.length();j++)
 79                 {
 80                     if (j!=i) s.push_back(b[j]);
 81                 }
 82                 int cnt=0;
 83                 for (int i=0;i<a.length();i++)
 84                 {
 85                     if (a[i]!=s[i]) cnt++;
 86                 }
 87                 if (cnt<=1) can=1;
 88             }
 89             if (can==1) puts("YES");
 90             else puts("NO");
 91         }
 92         else
 93         {
 94             int can=0;
 95             for (int i=0;i<b.length();i++)
 96             {
 97                 for (int j=i+1;j<b.length();j++)
 98                 {
 99                     int cnt=0;
100                     for (int k=0;k<b.length();k++)
101                     {
102                         if (k==i || k==j) continue;
103                         if (a[k]!=b[k]) cnt++;
104                     }
105                     if (cnt==0) can=1;
106                 }
107             }
108             for (int i=0;i<b.length();i++)
109             {
110                 for (int j=0;j<b.length();j++)
111                 {
112                     string s="";
113                     string t="";
114                     for (int k=0;k<b.length();k++)
115                     {
116                         if (k!=i) s.push_back(a[k]);
117                     }
118                     for (int k=0;k<b.length();k++)
119                     {
120                         if (k!=j) t.push_back(b[k]);
121                     }
122                     if (s==t) can=1;
123                 }
124             }
125             if (can==1) puts("YES");
126             else puts("NO");
127         }
128     }
129     return 0;
130 }
原文地址:https://www.cnblogs.com/1013star/p/10369696.html