Ananagrams UVa156

来源:互联网 发布:火牛软件网 编辑:程序博客网 时间:2024/06/05 00:51

还是汝佳的题 划重点 “映射map” 以及学习思路

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

思路:①关键是重排是否相等 通过把每个单词标准化 全部小写 并排序
②检验是否满足题意 不需要全部读取string 可以读取一个检查一遍 只要没出现过该值,即可以存入vector 熟悉这种写法
③注意输出要按照大小写 存入vector时要存原来的值

Sample 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
#
Sample Output

Disk
NotE
derail
drIed
eye
ladder
soon

#include <iostream>#include<vector>#include<map>#include<algorithm>#include<cctype>using namespace std;map<string,int> cnt;vector<string> word;string repr(const string& s);int main(int argc, char *argv[]){    string s;    while(cin>>s)    {        if(s[0] =='#')  break;        word.push_back(s);        string temp=repr(s);        if(!cnt.count(temp))    cnt[temp]=0;         cnt[temp]++;//第一次出现 count==0  以后加一 即实现 第一次出现计数为1 以后再出现则加一           }           vector<string> ans;    for(int i=0;i<word.size();i++)        if(cnt[repr(word[i])]==1)//注意cnt的键类型是string            ans.push_back(word[i]); //而vector<string> word    sort(ans.begin(),ans.end());    for(int i=0;i<ans.size();i++)         cout<<ans[i]<<endl;    return 0;}string repr(const string& s){    string a=s;    for(int i=0;i<a.length();i++)        a[i]=tolower(a[i]);    sort(a.begin(),a.end());        return a;}
0 0
原创粉丝点击