ACM-古老的密码(排序qsort)

古老的密码

题目描述:

给定两个长度一样且不超过100的字符串,判断是否能把其中一个字符串的各个字母重排,之后对26个字母做一个一一映射,使得两个字符串相同

例如,JWPUDJSTVP重排后可以得到WJDUPSJPVT,之后把每个字母映射到它的前面一个字母,得到VICTORIOUS,输入两个字符串,输出YES或者NO

题目分析:

因为字母可以重排映射(不一定往前映射),所以每个字母的位置并不重要,重要的是每个字母出现的次数

①统计两个字符串每个字母出现的次数,得到两个数组cnt1[26],cnt2[26]

②之后我们排序下,排序之后结果相同,映射的字符就相同

 

代码:

 

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <string.h>
 4 #define maxn 101 
 5 
 6 int cmp(const void *a, const void *b)
 7 {
 8     return *(int *)a - *(int *)b;//从小到大排序 
 9 }
10 /* 
11 int cmp(const void *a, const void *b)
12 {
13     return *(int *)b- *(int *)a;//从大到小排序 
14 }
15 */ 
16 int main()
17 {
18     char a[maxn];
19     char b[maxn];
20     while(scanf("%s%s",&a,&b) != EOF)
21     {
22         int len = strlen(a);
23         int cnt1[26],cnt2[26];
24         memset(cnt1,0,sizeof(cnt1));
25         memset(cnt2,0,sizeof(cnt2));
26 
27         for(int i=0; i < len; i++)
28         {
29             cnt1[a[i] - 'A']++; //A-0 B-1..... 
30             cnt2[b[i] - 'A']++;
31         }
32 
33         //排序
34         qsort(cnt1,26,sizeof(cnt1[0]),cmp);//qsort快速排序 
35         qsort(cnt2,26,sizeof(cnt2[0]),cmp);
36 
37         for(int i=0; i < 26; i++)
38         {
39             if(cnt1[i] != cnt2[i])
40             {
41                 printf("NO\n");
42                 return 0;
43             }
44         }
45         printf("YES\n");
46     }
47 
48     return 0;
49 }

 

 

 

posted @ 2016-11-14 12:15  JunQiu  阅读(549)  评论(1编辑  收藏  举报