Ananagrams
题目链接:Ananagrams
题目概述:题目描述的是一种字谜,即不区分大小写的多个字母,可以按不同的顺序组合,都被视为同一个单词。比如“POST”,“pstO”,“Otsp”…都被视为同一个单词。题目给了一系列单词,求出值出现一次的单词并数次。比如如果存在 “POST”和“pstO”则视为出现两次。
Input:
ladder came tape soon leader acme RIDE lone Dreis peat
ScAlE orb eye Rides dealer NotE derail LaCeS drIed
noel dire Disk mace Rob dries
#
Output:输出按字典顺序(不区分大小写)排列。
Disk
NotE
derail
drIed
eye
ladder
soon
解题思路:
主要利用map数据结构的 key 唯一性来实现。将每个字符串全部转为小写,在用sort进行排序。这样固定字母的不同大小写组合最终会被处理为同一个字符串。然后判断map是否存在该 dict[key],若不存在,则直接保存 dict[key]=原字符串。若存在,则令 dict[key]=”#”。为了按字典序输出,遍历 dict 将 value 不等于 ‘#’ 的放入set,在遍历输出就OK了。
最终代码:
#include <iostream>
#include <string>
#include <map>
#include<algorithm>
#include <set>
using namespace std;
int main()
{
map<string, string> dict;
set<string> result;
string key;
string value;
while(cin >> value && value!="#")
{
key = value;
for(unsigned int i = 0; i < key.length(); i++)
{
key[i] = tolower(key[i]);
}
sort(key.begin(), key.end());
pair<map<string, string>::iterator, bool> ret;
ret = dict.insert(pair<string, string>(key, value));
if(ret.second == false){
dict[key]="#";
}
}
for(map<string,string>::iterator it = dict.begin(); it != dict.end(); it++)
{
if(it->second != "#")
result.insert(it->second);
}
for(set<string>::iterator iter = result.begin();iter != result.end();iter++)
cout << *iter<<endl;
return 0;
}