题目地址:
题意说明:
就是给两个字符串如"JWPUDJSTVP"和 "VICTORIOUS",能否通过将前一个字符串做映射:每个字母变换为另一个字母(该字母可以与原始的字母重复但是与其他字母的映射字母不相同);以及重排得到另一个字符串。
- 例如对字符串"JWPUDJSTVP"做映射:得“IVOTCIRSUO”然后再重排可以得到“VICTORIOUS”。
- 例如“AAA”可以全部映射为“AAA”,因为字符串只有一个相同字母“A”所以映射可以全部取重复的。
- 又例如“HEHE”可以映射为“HAHA”也可以映射为“BEBE”......但是你不能将“HEHE”映射为“HHHH”因为映射发生了重复。
本题的关键在于怎么模拟这种转换,第一种容易想到的方法就是直接模拟这种字母的映射,但是题目所说的映射方式并没有明确给出,所以说并不好模拟,故不可取。第二种方法就是采用紫书上的排序(说实话我第一次看到这题看不懂刘老爷子在说什么),其实很好理解:就是第一个字符串如果有一个字母出现了n次,那么第二个字符串中一定也会有一个字母出现n次,因为第二个字符串由第一个映射而来。那么我们对两个字符串每个字母出现次数进行排序得到两个数组,如果这两个数组一样,就说明是符合条件的。
代码
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
char s1[110],s2[110];
int n1[26],n2[26];
using namespace std;
int main(){
while(scanf("%s%s",s1,s2)!=EOF){
memset(n1, 0, sizeof(n1));
memset(n2, 0, sizeof(n2));
int len = strlen(s1);
for(int i=0; i<len; i++)
{
n1[s1[i]-'A']++;
n2[s2[i]-'A']++;
}
//ÅÅÐò
sort(n1, n1+26);
sort(n2, n2+26);
bool ok = true;
for(int i = 0;i < 26;i++){
if(n1[i]!=n2[i]){
ok = false;
break;
}
}
if(ok) printf("YES\n");
else printf("NO\n");
}
return 0;
}