牛客寒假算法基礎集訓營2 處女座與復讀機(模擬 or DP)
阿新 • • 發佈:2019-02-13
-h abcd amp 示例 如果 添加 std span urn 輸出描述:
處女座與復讀機
鏈接: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 }
牛客寒假算法基礎集訓營2 處女座與復讀機(模擬 or DP)