仔细读题并且对比样例可以发现,字母的替换和换元的规律是不同的,所以不能用模拟法将原来的字符串找到进行比对,所以要从替换换元前后的特点来看。
替换:
替换前后的两个字母集合可以看作是一个映射;
例如 HAHA ——> HEHE
字母H可以 对应E 也可以 对应H
可以看一下映射的定义:
简单来说,就是集合A中有两个H,那么集合B中也有两个H或A
HHEE中,各个字母的个数为2,2
HHAA中,各个字母的个数也为2,2
那么我们就可以说上述两个满足替换法。
换元:
通过替换法,不难发现,只要我们各个字母的个数对应相等就可以,通过题干我们可以明白,每个字母还要进行顺序打乱。
举个例子:
字符串A中的字母个数为 2,1,3,5;
字符串B中的字母个数为 1,2,5,3;
A和B满足替换关系,那么我们如何更好的去比较呢:用sort函数将每个字母的个数进行规范排序,然后每个比对。
题目中的换元是将字母重排,简单来说就是字母的顺序不重要,因此我们可以用sort函数将每个字母的个数进行规范排序,然后每个比对。
#include<bits/stdc++.h>
using namespace std;
int judge(string s, string t) {
int ans1[26], ans2[26];
memset(ans2, 0, sizeof(ans2));
memset(ans1, 0, sizeof(ans1));
int l = s.length();
for (int i = 0; i < l; i++) {
ans1[(int)(s[i] - 'A')]++;
ans2[(int)(t[i] - 'A')]++;
}
sort(ans1, ans1 + 26);
sort(ans2, ans2 + 26);
for (int i = 0; i < 26; i++) {
if (ans1[i] != ans2[i]) {
cout << "NO" << endl;
return 0;
}
}
cout << "YES" << endl;
return 0;
}
int main() {
string s, t;
while (cin >> s >> t) {
judge(s, t);
}
}