开始把题目理解错了,以为字母替换都是将字母替换成它的下一个字母,即每个字符加1(z替换成A),其实每个字符加多少是没有限制的。解题的思路是统计加密后和加密前的字母出现频率,得到两个频率数组(每个数组有26个元素),不管加密时将字母往后移多少个位置,两个频率数组排序后是相等的。
代码:
#include<stdio.h> #include<string.h> int partition(int *s, int begin, int end) { int i,j; int pivot,temp; pivot = s[begin]; i=begin; j=begin+1; for(;j<=end; j++) { if(s[j]<pivot) { i++; temp = s[j]; s[j] = s[i]; s[i] = temp; } } temp = s[i]; s[i] = pivot; s[begin] = temp; return i; } void quickSort(int *s, int begin, int end) { int index; if(begin >= end) return; index = partition(s,begin,end); quickSort(s,begin, index-1); quickSort(s,index+1,end); } int main() { int i; int encrypt[26]={0}; int original[26]={0}; char ch; scanf("%c", &ch); while(ch != '\n') { encrypt[ch-'A']++; scanf("%c", &ch); } scanf("%c", &ch); while(ch != '\n') { original[ch-'A']++; scanf("%c", &ch); } quickSort(encrypt, 0, 25); quickSort(original, 0, 25); for(i=0; i<26; i++) { if(encrypt[i] != original[i]) { printf("NO\n"); break; } } if(i==26) printf("YES\n"); return 0; }