题目连接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=92
题目大意:一个单词随便改变字母顺序后成为一个新单词,这个新单词不再这个单词所在的文章中,则该单词是ananagrams,你的任务就是要找到这样的单词并按字典顺序输出。
解题思路:我们可以先设置一个set容器,用来储存所有的单词,然后对每一个单词中的字母按从小到大排序,用map容器记录排序后单词的数量,如果随便改变单词中字母的顺序形成的新单词不是文章中的单词。则map中记录的值为1,这是就可以新建一个set容器储存结果,最后输出就可以了
AC代码:
#include<iostream>
#include<set>
#include<string>
#include<cstring>
#include<map>
#include<algorithm>
using namespace std;
int main()
{
string a,b;
set<string> word;//记录输入的单词
set<string> ans;//记录要输出的单词
map<string,int> sum_word;//记录排序后单词的数量;
while(cin>>a)
{
b="";
if(a=="#")
break;
word.insert(a);
for(int i=0;i<a.size();i++)//将输入的单词转换为小写
b+=tolower(a[i]);
sort(b.begin(),b.end());//对字符串b进行排序
sum_word[b]++;//记录排序后单词的数量
}
set<string>::iterator it;
for(it=word.begin();it!=word.end();it++)//遍历,符合题意的单词加进ans中
{
b="";
for(int i=0;i<(*it).size();i++)
{
b+=tolower((*it)[i]);
}
sort(b.begin(),b.end());//对单词中字母排序
if(sum_word[b]==1)//如果等于1说明符合题意,加进去
ans.insert(*it);
}
for(it=ans.begin();it!=ans.end();it++)//输出结果
cout<<*it<<endl;
return 0;
}