1. 程式人生 > >藍橋杯 演算法訓練 ALGO-91 Anagrams問題 陣列運算 字元操作

藍橋杯 演算法訓練 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;
}