UVA Ananagrams /// map set

https://vjudge.net/problem/UVA-156

题目大意:

输入文本,找出所有满足条件的单词——该单词不能通过字母重排而得到输入的文本中的另外一个单词。

在判断是否满足条件时,字母不分大小写,但在输出时应保留输入中的大小写,按字典序进行排序。

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

将所有单词转为小写再sort后存入map中,若已出现过则继续加1,若未出现过则先赋零再加1

将所有单词原文本存入set中,会直接按字典序排序,最后遍历set 判断 输出

#include <bits/stdc++.h>
using namespace std;
map <string,int> mp;
set <string> had;
string judge(string str)
{
    string s=str;
    for(int i=0;i<s.length();i++)
        s[i]=tolower(s[i]);    ///将单词转为小写再排序
    sort(s.begin(),s.end());  
    return s;
}
int main()
{
    string str;
    while(cin>>str)
    {
        had.insert(str);    ///将原文本单词存入set
        if(str[0]=='#') break;
        string temp=judge(str);  
        if(mp.count(temp)==0) mp[temp]=0; 
        mp[temp]++;  ///转换后的单词是否出现过 无则赋零+1有则+1
    }
    set <string>::iterator iter;
    for(iter=had.begin();iter!=had.end();iter++)
        if(mp[judge(*iter)]==1) cout<<*iter<<endl; 
                         ///为1表示没有重复只出现过一次 
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/zquzjx/p/8405903.html