UVa 156 Ananagrams

题目大意

输入一些单词,找出满足一下条件的单词:该单词不能通过字母重新排列,得到输入文本中的另一个单词。在判断是否满足条件时,字母不分大小写,但是输出时应保留大小写,并按照字典序进行排列。

解题思路

首先可以想到,我们需要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;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值