这里我就是直接排序了
#include<stdio.h>
#include<iostream>
#include <algorithm>
using namespace std;
int main()
{
int i;
char a[101],b[101];
int alphabetA[26], alphabetB[26];
cin >> a;
cin >> b;
for (i = 0; i < 26; i++)
{
alphabetA[i] = 0;
}
for (i = 0; i < 26; i++)
{
alphabetB[i] = 0;
}
//分别计算两个的频率
for (i = 0; a[i] != '\0'; i++)
{
alphabetA[a[i] - 'A']++;
}
for (i = 0; b[i] != '\0'; i++)
{
alphabetB[b[i] - 'A']++;
}
//题目里的陷阱是 如果不相等
sort(alphabetA, alphabetA + 26);
sort(alphabetB, alphabetB + 26);
for (i = 0; i < 26; i++)
{
if (alphabetA[i] != alphabetB[i])
{
cout << "NO" << endl;
return 0;
}
}
cout << "YES" << endl;
return 0;
}
然而网上还有一些使用hash的方式,虽然看起来,似乎是个求和运算,但是实际上,这种球和能保证只要和不一样,两个原始频率就不一样,但是要注意出现1 1 1 1和2 2的情况,所以如果使用这种方法 需要控制两个数组中 有数字的部分相等。
#include<cstdio>
#include<cstdlib>
const int MAXSIZE=26;
int anum[MAXSIZE],bnum[MAXSIZE];
int main(){
char ch;
while((ch=getchar())!='\n')
++anum[ch-'A'];
while((ch=getchar())!='\n')
++bnum[ch-'A'];
<span style="white-space:pre"> </span>//*************这里欠缺了比较两个字符串的个数是否一致的情况
int hash1=0,hash2=0;
for(int i=0;i!=MAXSIZE;++i){
hash1+=anum[i]*anum[i];
hash2+=bnum[i]*bnum[i];
}
if(hash1==hash2)
printf("YES");
else
printf("NO");
return EXIT_SUCCESS;
}