链接:https://ac.nowcoder.com/acm/contest/327/G
一天,处女座在牛客算法群里发了一句“我好强啊”,引起无数的复读,可是处女座发现复读之后变成了“处女座好强啊”。处女座经过调查发现群里的复读机都是失真的复读机,会固定的产生两个错误。一个错误可以是下面的形式之一:
1. 将任意一个小写字母替换成另外一个小写字母
2. 在任意位置添加一个小写字母
3. 删除任意一个字母
处女座现在在群里发了一句话,他收到了一个回应,他想知道这是不是一个复读机。
两行
第一行是处女座说的话s
第二行是收到的回应t
s和t只由小写字母构成且长度小于100
如果这可能是一个复读机输出”YES”,否则输出”NO”
abc
abcde
YES
abc->abcd->abcde
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 }
牛客寒假算法基础集训营2 处女座与复读机(模拟 or DP)
原文:https://www.cnblogs.com/1013star/p/10369696.html