算法训练 Anagrams问题
时间限制:1.0s 内存限制:512.0MB
提交此题
问题描述
Anagrams指的是具有如下特性的两个单词:在这两个单词当中,每一个英文字母(不区分大小写)所出现的次数都是相同的。例如,“Unclear”和“Nuclear”、“Rimon”和“MinOR”都是Anagrams。编写一个程序,输入两个单词,然后判断一下,这两个单词是否是Anagrams。每一个单词的长度不会超过80个字符,而且是大小写无关的。
输入格式:输入有两行,分别为两个单词。
输出格式:输出只有一个字母Y或N,分别表示Yes和No。
输入输出样例
样例输入
Unclear
Nuclear
样例输出
Y
分析:
如果用KMP去遍历字符串从而查找字母的重复个数的话,会很麻烦。这里由于字母只有26个,不区分大小写,因此可以定义两个辅助的数组,用来存26个字母出现的个数。然后两个数组进行比较。
思路:
如果两个字符串本身长度都不一致,肯定不会是Anagrams。
如果两个数组相同下标下的值不同,肯定不会是Anagrams。
当且仅当两个字符串长度一致,辅助数组相同下标下的值相同时,才满足Anagrams。
代码如下:
#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
int main()
{
string a, b;
int len1, len2;
vector<int> m(26), n(26);
int i, j, k;
cin >> a >> b;
//字符串长度
len1 = a.length();
len2 = b.length();
if(len1 != len2)
{
cout << "N" << endl;
return 0;
}
//字母个数
for(i = 0; i < len1; i++)
{
j = (a[i] < 97) ? a[i]-'A' : a[i]-'a';
m[j]++;
j = (b[i] < 97) ? b[i]-'A' : b[i]-'a';
n[j]++;
}
for(i = 0, k = 0; i < 26; i++)
{
if(m[i] != n[i])
{
cout << "N" << endl;
return 0;
}
if(m[i] != 0)
{
k++;
if(k == len1)
{
cout << "Y" << endl;
return 0;
}
}
}
cout << "Y" << endl;
return 0;
}