题目大意
输入一些单词,找出满足一下条件的单词:该单词不能通过字母重新排列,得到输入文本中的另一个单词。在判断是否满足条件时,字母不分大小写,但是输出时应保留大小写,并按照字典序进行排列。
解题思路
首先可以想到,我们需要map来存储不重复的单词。
那么什么是不重复的单词呢,从题意我们知道,不重复的单词是指,以字母为数组,两个数组中的元素不重合的单词。
那么我们可以把所有的单词按照字典序进行重新排列,排列之后两个单词是否相同就很明显了。
由于输出单词的样子要和输入的一样,并且输出的单词要按照字典序排列,所以我们可以用两个vector来分别存储输入的单词和要输出的单词。而map就用来存储不重复单词的出现次数,出现一次就可以输出,出现两次及以上,就不用管啦。
用到的小技巧
首先是string的库函数tolower,用来把大写字母变成小写字母
其次是map的库函数map.count(s),返回 s 在map中出现的次数。当然由于map的元素都是不重复的,所以 s 只可能存在一次,因此要么返回有(1),要么返回没有(0)。
map还有一个类似的函数,map.find(s),find和count的差别就是,find返回地址,count返回次数。如果没找到,find就返回map.end()。
至于sort函数就不用多说了吧!简简单单经常用到的排序函数。
#include<iostream>
#include<map>
#include<vector>
#include<algorithm>
using namespace std;
map<string, int> mmap;
vector<string> words;
string re(string s){//把大写变小写,单词重新排序
string ans=s;
for(int i=0;i<s.size();i++){
ans[i]=tolower(ans[i]);
}
sort(ans.begin(),ans.end());
return ans;
}
int main()
{
string s;
while(cin>>s){
if(s[0]=='#')break;
words.push_back(s);
string temp=re(s);
if(!mmap.count(temp))mmap[temp]=0;//如果mmap里面没有temp,把它的值初始化为0
mmap[temp]++;//出现一次就加一
}
vector<string> ans;
for(int i=0;i<words.size();i++){
if(mmap[re(words[i])]==1)ans.push_back(words[i]);//只出现一次,就可以加入输出的队列
}
sort(ans.begin(),ans.end());
for(int i=0;i<ans.size();i++)
cout<<ans[i]<<"\n";
return 0;
}