蓝桥杯 算法训练 ALGO-91 Anagrams问题 数组运算 字符操作

算法训练 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;
}

猜你喜欢

转载自blog.csdn.net/weixin_43302818/article/details/85068386