题目:
给定两个长度相同且不超过100的字符串,判断是否能把其中一个字符串的各个字母重排,然后对26个字母做一个一一映射,使得两个字符串相同。例如,JWPUDJSTVP后可以得到WJDUPSJPVT,然后把每个字母映射到它前一个字母(B->A,C->B,...,A->Z),得到VICTORIOUS。输入两个字符串,输入YES或者NO。
分析:
既然字母可以重排,则每个字母的位置并不重要,重要的是每个字母出现的次数。这样可以先统计出两个字符串中各个字母出现的次数,得到两个数组cnt1[26]和cnt2[26]。下一步需要一点想象力:只要两个数组排序后的结果相同,输入的两个字符串就可以通过重排和一一映射变得相同。这样,问题的核心就是排序。
C语言的stdlib.h中有一个叫qsort的库函数,实现了著名的快速排序算法。他的声明是这样的:
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <vector>
#include <string>
using namespace std;
typedef long long ll;
int x[110],y[110];
int main()
{
char a[110],b[110];
scanf("%s%s",a,b);
int n=strlen(a);
for(int i=0;i<n;i++){
x[a[i]-'A']++;
y[b[i]-'A']++;
}
sort(x+0,x+26);
sort(y+0,y+26);
/* for(int i=0;i<26;i++)
{
printf("x%d=%d\n",i,x[i]);
printf("y%d=%d\n",i,y[i]);
}*/
for(int i=0;i<26;i++)
{
if(x[i]!=y[i]){
puts("NO");
return 0;
}
}
puts("YES");
}