标签:
问题描述
Anagrams指的是具有如下特性的两个单词:在这两个单词当中,每一个英文字母(不区分大小写)所出现的次数都是相同的。例如,“Unclear”和“Nuclear”、“Rimon”和“MinOR”都是Anagrams。编写一个程序,输入两个单词,然后判断一下,这两个单词是否是Anagrams。每一个单词的长度不会超过80个字符,而且是大小写无关的。
输入格式:输入有两行,分别为两个单词。
输出格式:输出只有一个字母Y或N,分别表示Yes和No。
输入输出样例
样例输入
Unclear
Nuclear
样例输出
Y
解题分析:
这道题看着不好想其实又巧妙的方法,这里我说两种,
一是定义一个数组a[26],接着分别输入两个字符串,边输入边计数,利用哈希算法的思想,
对应的把字母存到相应的数组中,遍历数组,如果数据中存在的元素是偶数个的话,说明两个
数相同(这里没有考虑大小写的问题,需要自己处理)。
二是我要讲的代码的思路。这道题的思路其实很简单没有第一种思路那么麻烦,这里可以把两
个字符串的相等的问题转化为字母的ASCII的问题,加入两个字符串相等(这里也没有考虑大
小写问题,需要自己进行处理),只要是每个字符串的每个字母相加的和,还有每个字母相乘
的积,保证这两个相等就可以了。
代码如下:
#include <iostream>
#include <cstring>
#include <cstdio>
#define MAXN 81
using namespace std;
char s1[MAXN], s2[MAXN];
int main()
{
int len1, len2, sum1 = 0, sum2 = 0, mult1 = 1, mult2 = 1;
scanf("%s", s1);
scanf("%s", s2);
len1 = strlen(s1);
len2 = strlen(s2);
if(len1 != len2)
printf("N");
else
{
for(int i = 0; i < len1; i++)
{
if(islower(s1[i]))
//这里是将小写的字母转换成为大写字母
s1[i] = toupper(s1[i]);
if(islower(s2[i]))
s2[i] = toupper(s2[i]);
}
for(int j = 0; j < len1; j++)
{
sum1 = sum1 + s1[j];
sum2 = sum2 + s2[j];
mult1 = (mult1 * s1[j]);
mult2 = (mult2 * s2[j]);
}
if(sum1 == sum2 && mult1 == mult2)
cout<<"Y";
else
cout<<"N";
}
return 0;
}
Anagrams问题 ---- 蓝桥杯
标签:
原文地址:http://blog.csdn.net/u012965373/article/details/44873947