1. 程式人生 > >牛客寒假算法基礎集訓營2 處女座與復讀機(模擬 or DP)

牛客寒假算法基礎集訓營2 處女座與復讀機(模擬 or DP)

-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)