题意:给定两个长度相同且不超过100的字符串,判断是否能把其中一个字符串的各个字母重拍排,然后对26个字母做一个一一映射,使两个字符串相同。
uva提示:字母的位置不重要,重要的是每个字母出现的次数。
先统计出两个字符串中各个字母出现的次数,得到两个数组。
只要两个数组排序之后结果相同,一一映射就相同。
解题关键点:qsort库函数。(炒炒炒炒炒鸡厉害的排序函数 很重要!)
包括四部分参数。
qsort(数组起始地址,数组长度(元素个数),sizeof(a[0])/(int)*, cmp(一个关于从小到大或者从大到小的函数));
* :这里是用来表示一个元素所占字节大小 sizeof(a[0]) sizeof(int) 这是两种写法 都表示 每个数组元素的内存大小
注:sizeof是求字节数的函数。a如果是int,float ,long的就是4个字节。short的就是2个。char的就是1个 double的就是8个,(32位系统)
声明完这四部分之后。其中cmp部分需要我们再声明一个独立的函数。
如:
int cmp(const void *n,const void *m )//这里是递减排序
{
return *(int*)m-*(int*)n;
}
int cmp(const void *n,const void *m )//递增排序
{
return *(int*)n-*(int*)m;
}
具体关于这个函数的解释 可以去看紫书的P73页。 也可以百度qsort函数查到这个函数的用法。
代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char a[101];
char b[101];
int cmp(const void *n,const void *m )//递减排序
{
return *(int*)m-*(int*)n;
}
int main()
{
int i;
while(scanf("%s",a)!=EOF)
{
scanf("%s",b);
int n;
n=strlen(a);
int c[30],d[30];
memset(c,0,sizeof(c));//将数组清零
memset(d,0,sizeof(d));
for(i=0;i<n;i++)
{
c[a[i]-'A']++;//记录每个字母个数(只是为了记录不同字母他们的个数,不是为了记录每个对应字母对应的个数)
d[b[i]-'A']++;//因为这个题只需要比较相同的字母个数是不是一一对应即可。
}
qsort(c,27,sizeof(c[0]),cmp);//qsort函数排序
qsort(d,27,sizeof(d[0]),cmp);
int flag;
ans=1;
for(i=0;i<27;i++)
{
if(c[i]!=d[i])
{
flag=0;//判断两个数组中元素是不是相同对应个数的标志
break;
}
}
if(flag==1)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}