古老的密码
题目描述:
给定两个长度一样且不超过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 "); 42 return 0; 43 } 44 } 45 printf("YES "); 46 } 47 48 return 0; 49 }