魔法串
问题描述 :
小明和他的好朋友小西在玩一个新的游戏,由小西给出一个由小写字母构成的字符串,小明给出另一个比小西更长的字符串,也由小写字母组成,如果能通过魔法转换使小明的串和小西的变成同一个,那么他们两个人都会很开心。这里魔法指的是小明的串可以任意删掉某个字符,或者把某些字符对照字符变化表变化。
如: 小西的串是 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 }