算法竞赛入门经典(第2版)第4章 函数和递归
例题4-1 古老的密码 UVa1339
感悟。
1、阅读书中题目,对映射方式(B->A,C->B,...,Z->Y),印象深刻,马上编码。
2、但有一组测试样例无法通过,如下。
HAHA
HEHE
YES
3、上网站下载英文原题,对照翻译软件查单词,仔细阅读。只读出替换字母打乱顺序,加密方式比较强劲,其他没读出个所以然。
4、参考http://blog.csdn.net/thudaliangrx/article/details/50700688代码,跟踪调试,才明白了,字母替换只要满足同样的字母用另一个同样的字母替换就可以了,没有其他顺序上的要求。
5、重新编码,用了冒泡排序,按字母频度由小到大排列,提交AC。
附上代码
环境Dev-cpp4.9.9.2
#include <stdio.h>
#include <string.h>
char s[100+10],t[100+10];
int cnts[26+10],cntt[26+10];//统计字母出现频率
void bubblesort(int *cnt){//自小到大排序
int i,j;
int len=26;
int t;
for(i=0;i<len;i++)
for(j=i+1;j<len;j++)
if(cnt[i]>cnt[j]){
t=cnt[i];
cnt[i]=cnt[j];
cnt[j]=t;
}
}
int main(){
int i;
int slen;
int k;
int len=26;
while(scanf("%s%s",s,t)!=EOF){
slen=strlen(s);
k=s[0]-t[0];
memset(cnts,0,sizeof(cnts));
memset(cntt,0,sizeof(cntt));
for(i=0;i<slen;i++){//统计字母出现频度
cnts[s[i]-'A']++;
cntt[t[i]-'A']++;
}
bubblesort(cnts);
bubblesort(cntt);
for(i=0;i<len;i++)//两个字符串出现频度是否一致
if(cnts[i]!=cntt[i])
break;
if(len==i)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}