您的位置:首页 > 其它

蓝桥杯算法训练 Anagrams问题

2017-12-20 14:30 260 查看
算法训练 Anagrams问题  时间限制:1.0s   内存限制:512.0MB问题描述  Anagrams指的是具有如下特性的两个单词:在这两个单词当中,每一个英文字母(不区分大小写)所出现的次数都是相同的。例如,“Unclear”和“Nuclear”、“Rimon”和“MinOR”都是Anagrams。编写一个程序,输入两个单词,然后判断一下,这两个单词是否是Anagrams。每一个单词的长度不会超过80个字符,而且是大小写无关的。
  输入格式:输入有两行,分别为两个单词。
  输出格式:输出只有一个字母Y或N,分别表示Yes和No。
  输入输出样例样例输入Unclear
Nuclear样例输出Y

算法设计:

首先如果两个字符串长度不等,则必然不是Anagrams。
定义一个维度为128的hashTable数组(ascii码共计128个),数组元素初始化为0,遍历两个字符串,对于第一个字符串中每一个字符,将hashTable数组的对应位置的元素+1;对于第二个字符串中每一个字符,将hashTable数组的对应位置的元素-1。遍历整个hashTable数组,如果有不为0的元素,则不是Anagrams;否则是Anagrams。

注意点:

不区分大小写,可以将利用tolower()函数将字符串每个字符转换为小写字符

c++代码:

#include<bits/stdc++.h>
using namespace std;
int main(){
//读取两个字符串
char s1[85],s2[85];
gets(s1);
gets(s2);
int len1=strlen(s1),len2=strlen(s2);//读取两个字符串长度
if(len1!=len2){//如果字符串长度不等,输出N
printf("N");
return 0;
}
int hashTable[128];//定义辅助数组
memset(hashTable,0,sizeof(hashTable));//将数组元素初始化为0
for(int i=0;i<len1;++i){
++hashTable[tolower(s1[i])];//将hashTable数组的对应位置的元素+1
--hashTable[tolower(s2[i])];//将hashTable数组的对应位置的元素-1
}
//遍历hashTable数组查找是否有元素不为0
for(int i=0;i<128;++i)
if(hashTable[i]!=0){//元素不为0输出N
printf("N");
return 0;
}
printf("Y");//输出Y
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  蓝桥杯 算法 函数