题意太关键了,是两个字符串,让你对其中一个字符串操作。操作内容是,可以将这个字符串任意排列,然后将这个字符串中所有相同的字符随意映射成其他一种字符,使得映射后的字符串与另一个字符串相同。
所以只需要将所有相同字符的数量记录下来,与另一个字符串比较有没有这个数量的字符就行了。
(用数组存放每个字符的数量)
代码如下:
#include<iostream>//UVA1339
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
char str1[105],str2[105];
while(~scanf("%s%s",str1,str2))
{
int len=strlen(str1);
int cnt1[26]={0},cnt2[26]={0};
for(int i=0;i<len;i++)
{
cnt1[str1[i]-'A']++;
cnt2[str2[i]-'A']++;
}
sort(cnt1,cnt1+26);
sort(cnt2,cnt2+26);
int flag=0;
for(int i=1;i<26;i++)
if(cnt1[i]!=cnt2[i])
{
flag=1;//如果有不相等的
break;
}
if(flag)
printf("NO\n");
else
printf("YES\n");
}
return 0;
}
这次又学了一个qsort,也用一次吧
qsort(from 刘汝佳书):
void qsort(void *base,size_t num,size_t size,
int (* comparator)(const void *,const void *));
数组起始地址,元素个数,每个元素大小,一个指向函数的指针(万能指针,const void *可以通过强制转换转化成任意类型的指针)
cmp
int cmp(const void *a,const void *b)//据说const void *可以通过强制转换
{//转化成任意类型的
return *(int *)a-*(int *)b;
}
#include<iostream>//UVA1339
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int cmp(const void *a,const void *b)//据说const void *可以通过强制转换
{//转化成任意类型的
return *(int *)a-*(int *)b;
}
int main()
{
char str1[105],str2[105];
while(~scanf("%s%s",str1,str2))
{
int len=strlen(str1);
int cnt1[26]={0},cnt2[26]={0};
for(int i=0;i<len;i++)
{
cnt1[str1[i]-'A']++;
cnt2[str2[i]-'A']++;
}
qsort(cnt1,26,sizeof(int),cmp);
qsort(cnt2,26,sizeof(int),cmp);
int flag=0;
for(int i=1;i<26;i++)
if(cnt1[i]!=cnt2[i])
{
flag=1;//如果有不相等的
break;
}
if(flag)
printf("NO\n");
else
printf("YES\n");
}
return 0;
}