156 - Ananagrams

156 - Ananagrams

    






















题意:由相同字母组成(忽略大小写),只是顺序不同的单词称为anagram,而题目就是要找出给定文本中不是anagram的单词。

思路:判断是否为anagram可以先将单词全部转成小写字母,并用库函数sort(algorithm头文件中)对其排序得到一个字母序递增的单词,称其为标准单词,则只要任意两个单词的标准单词相同,即他们是anagram。

虽然判断时忽略了大小写,但是输出时是区分大小写的,此时可以用map来建立标准单词与原单词的关系,以标准单词做为键,原单词作为值。此时判断是否为anagram就可以调用map的成员函数count(key);count(key)返回指定键值在map中的数量,由于map的键值唯一,所以对于map而言count只返回0或1.

而按照词典序输出,可直接将单词保存到set中(利用set集合有序的属性,对于字符而言是字典序有序

代码:

#include<iostream>
#include<map>
#include<set>
#include<string>
#include<algorithm>
using namespace std;
int main(void) {
	string s,ss;
	multimap<string, string>mp;
	set<string>se;
	while (cin>>s){
		if (s[0] == '#') break;
		int n = s.size();
		ss = s;
		for (int i = 0; i < n; i++)
			if (isupper(ss[i]))
				ss[i]=tolower(ss[i]);
		sort(ss.begin(),ss.end());
		mp.insert(make_pair(ss, s));
	}
	
	for (map<string, string>::iterator it = mp.begin(); it != mp.end(); it++)
		if (mp.count(it->first) == 1)
			se.insert(it->second);
	for (set<string>::iterator it = se.begin(); it != se.end(); it++)
		cout << *it << endl;
	return 0;
}


猜你喜欢

转载自blog.csdn.net/Titanium_S/article/details/79198549
156
今日推荐