算法竞赛入门经典--古老的密码

这一题的主要思路,很简单,对两个字符串都排序,对第一个字符串映射,再比较下两个字符串是否相等,相等输出YES 否则输出NO;
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int cmp(const void *a,const void *b)
{
	 return *(char*)a-*(char*)b;
}
int cmp1(const void *a,const void *b)
{
	 return *(int*)a-*(int*)b;
}			//两个qsort的cmp函数,为了两个字符串排序。
int main()
{
	char a[110],b[110];
	int i,j;
	while(~scanf("%s%s",a,b))
	{
		int lena,lenb,c[26],d[26],k=-1,k1=-1,f;
		memset(c,0,sizeof(c));
		memset(d,0,sizeof(d));
		lena=strlen(a);
		lenb=strlen(b);
		if(lena!=lenb) printf("NO\n");//长度不等,直接排除
		qsort(a,lena,sizeof(a[0]),cmp);
		qsort(b,lenb,sizeof(b[0]),cmp);//排序
		for(i=0;i<lena;i++)
		{
			if(a[i]==a[i-1])
				c[k]+=1;
			else if(a[i]!=a[i-1])
			{
				k++;
				c[k]+=1;
			}
			if(b[i]==b[i-1])
				d[k1]+=1;
			else if(b[i]!=b[i-1])
			{
				k1++;
				d[k1]+=1;
			}
		}		//k1和k分别为两个字符串的里的种类个数
		qsort(c,k+1,sizeof(c[0]),cmp1);
		qsort(d,k1+1,sizeof(d[0]),cmp1);
		/*for(i=0;i<=k1;i++)
			printf("%d",c[i]);
		printf("\n");
		for(i=0;i<=k1;i++)
			printf("%d",d[i]);
		printf("\n");*/
		if(k1!=k) printf("NO\n");//种类个数不同直接排除
		else
		{
			f=0;
			for(i=0;i<=k;i++)
			{
				if(c[i]!=d[i])
				{
					f=1;
					break;//有一个种类的单体数量不等,直接break,排除;
				}//每个种类的单体个数是否相等
			}
			if(f==0) printf("YES\n");//全部都相等
			else 	printf("NO\n");//有一个不等或者多个不等
		}
	}
} 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值