• 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
    
    
    
    
    
  • 相关阅读:
    leetcode319
    leetcode516
    leetcode46
    leetcode337
    leetcode287
    leetcode328
    leetcode241
    2018-6-30-dotnet-设计规范-·-抽象类
    2018-6-30-dotnet-设计规范-·-抽象类
    2018-8-10-WPF-如何画出1像素的线
  • 原文地址:https://www.cnblogs.com/xinxiangqing/p/5014038.html
Copyright © 2020-2023  润新知