ALGO-188 VIP试题 P0504 Anagrams问题
和 ALGO-91 Anagrams问题 是相同的两个题,只是输出不同。。。
我的做法如下:
#include<iostream>
#include<algorithm>
#include<string>
#include<cstdio>
#include<cstring>
#include<cctype>
using namespace std;
int main()
{
char a[81];
char b[81];
scanf("%s",a);
scanf("%s",b);
int lena = strlen(a);
int lenb = strlen(b);
if( lena != lenb )
{
printf("no\n");
return 0;
}
for(int i=0;i<lena;i++)
a[i] = tolower(a[i]);
for(int i=0;i<lenb;i++)
b[i] = tolower(b[i]);
sort(a,a+lena);
sort(b,b+lenb);
if(strcmp(a,b)==0)
printf("yes\n");
else
printf("no\n");
return 0;
}
感觉自己的做法有些不妥,又找了大佬们的两个思路:
1、这里由于字母只有26个,不区分大小写,因此可以定义两个辅助的数组,用来存26个字母出现的个数。然后两个数组进行比较。
思路:
如果两个字符串本身长度都不一致,肯定不会是Anagrams。
如果两个数组相同下标下的值不同,肯定不会是Anagrams。
当且仅当两个字符串长度一致,辅助数组相同下标下的值相同时,才满足Anagrams。
#include<iostream>
#include<algorithm>
#include<string>
#include<cstdio>
#include<cstring>
#include<cctype>
using namespace std;
int main()
{
char a[81],b[81];
int counta[26]={0},countb[26]={0};
scanf("%s",a);
scanf("%s",b);
int lena = strlen(a);
int lenb = strlen(b);
if( lena != lenb )
{
printf("no\n");
return 0; //若不相等直接结束程序,否则继续
}
strlwr(a);
strlwr(b);
for(int i=0;i<lena;i++)
{
counta[a[i]-'a']++;
countb[b[i]-'a']++;
}
for(int i=0;i<26;i++)
if(counta[i] != countb[i])
{
printf("no\n");
return 0;
}
printf("yes\n");
return 0;
}
2、先把单词转化为小写(大写也可以),将每个单词的字母相加、相乘。比较相加、相乘的结果是否全部相同,若是,Y,否则,N。
#include<iostream>
#include<algorithm>
#include<string>
#include<cstdio>
#include<cstring>
#include<cctype>
using namespace std;
int main()
{
char a[81],b[81];
scanf("%s",a);
scanf("%s",b);
int lena = strlen(a);
int lenb = strlen(b);
if( lena != lenb )
{
printf("no\n");
return 0; //若不相等直接结束程序,否则就继续
}
strlwr(a);
strlwr(b);
int sum1=0,sum2=0;
int mult1=1,mult2=1;
for(int i=0;i<lena;i++)
{
sum1=(sum1+a[i])%100000;
sum2=(sum2+b[i])%100000;
mult1=(mult1*a[i])%1000000;
mult2=(mult2*b[i])%1000000;
}
if(sum1==sum2&&mult1==mult2)
printf("yes\n");
else
printf("no\n");
return 0;
}