开始把题目理解错了,以为字母替换都是将字母替换成它的下一个字母,即每个字符加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;
}