HDU 4545-魔法串-字符串

                                                                                                魔法串

问题描述 :

  小明和他的好朋友小西在玩一个新的游戏,由小西给出一个由小写字母构成的字符串,小明给出另一个比小西更长的字符串,也由小写字母组成,如果能通过魔法转换使小明的串和小西的变成同一个,那么他们两个人都会很开心。这里魔法指的是小明的串可以任意删掉某个字符,或者把某些字符对照字符变化表变化
如:     小西的串是 abba;    
                小明的串是 addba;     
                  字符变化表 d b (表示d能转换成b)。   
                  那么小明可以通过删掉第一个d,然后将第二个d转换成b将串变成abba。

 

  现在请你帮忙判断:他们能不能通过魔法转换使两个人的串变成一样呢?

输入:

  首先输入T,表示总共有T组测试数据(T <= 40)。   接下来共T组数据,每组数据第一行输入小西的字符串,第二行输入小明的字符串(数据保证字符串长度不超过1000,小明的串的长度大于等于小西的,且所有字符均为小写字母)。接着输入字母表,先输入m,表示有m个字符变换方式(m< = 100),接着m行每行输入两个小写字母,表示前一个可以变为后一个(但并不代表后一个能变成前一个)。

输出:

  首先输入T,表示总共有T组测试数据(T <= 40)。   接下来共T组数据,每组数据第一行输入小西的字符串,第二行输入小明的字符串(数据保证字符串长度不超过1000,小明的串的长度大于等于小西的,且所有字符均为小写字母)。接着输入字母表,先输入m,表示有m个字符变换方式(m< = 100),接着m行每行输入两个小写字母,表示前一个可以变为后一个(但并不代表后一个能变成前一个)。

样例输入:

2
abba
addba 
1
d b
a
dd
0

样例输出:

Case #1: happy
Case #2: unhappy
解题思路:
(1)、因为这是一道关于字符串的问题,当我们敲换行键的时候,我们要用一个getchar()来接收这个换行键。
(2)、我们用一个数组来记录可以转换的字符,打印出一张转换表
(3)、我们把s2转成和s1相同的字符串有两种方法,从s2删除或按照转换表将s2进行转换
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 using namespace std;
 5 char s1[1005],s2[1005];
 6 int main()
 7 {
 8     int T;
 9     cin>>T;
10     int len1,len2;
11     for(int cas=1;cas<=T;cas++)
12     {
13         getchar();
14         gets(s2);
15         len1=strlen(s1);
16         len2=strlen(s2);
17         int n,i,j;
18         int change[30][30]={0};
19         cin>>n;
20         for(i=0;i<n;i++)
21         {
22             getchar();
23             char a,b;
24             scanf("%c %c",&a,&b);
25             change[a-'a'][b-'a']=1;//打下一个转换表
26 
27         }
28         int flag=0;//标记
29         j=0;// 控制s2的下标
30         for(i=0;i<len1;i++)
31         {
32             if(j==len2)//s2全部遍历完毕
33                 break;
34             if(s1[i]==s2[j])
35             {
36                 j++;
37                 continue;
38             }
39             while(s1[i]!=s2[j])
40             {
41                 if(j==len2)//s2遍历到最后一个,却没有使s2转换成和s1一样
42                 {
43                     flag=1;//标记
44                     break;
45                 }
46                 if(change[s2[j]-'a'][s1[i]-'a']==1)//查看转换表
47                 {
48                     j++;
49                     break;
50                 }
51                 else
52                     j++;//直接删除
53             }
54         }
55         cout<<"Case #"<<cas<<": ";
56         if(flag)
57             cout<<"unhappy"<<endl;
58         else
59             cout<<"happy"<<endl;
60     }
61     return 0;
62 }
View Code



原文地址:https://www.cnblogs.com/xinxiangqing/p/5014038.html