反片语(Ananagrams , UVa 156)

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

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

(所有大写字母在所有小写字母的前面)

样例输入:

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

#

样例输出:

Disk

NotE

derail

drIed

eye

ladder

soon

 

分析:

把每个单词标准化,即全部转化为小写字母后再进行排序,然后放到map中进行统计。

代码如下:

#include<iostream>
#include<string>
#include<cctype>
#include<vector>
#include<map>
#include<algorithm>
using namespace std;

map<string,int> cnt;
vector<string> words;

//将单词s进行标准化
string repr(const string& s) {
    string ans = s;
    for(int i=0;i<ans.length();i++){
        ans[i] = tolower(ans[i]);
    }
    sort(ans.begin(),ans.end());
    return ans;
}

int main(){
    int n=0;
    string s;
    while(cin>>s){
        if(s[0] == '#') break;
        words.push_back(s);
        string r = repr(s);
        if(!cnt.count(r)) cnt[r] = 0;
        cnt[r]++;
    }
    vector<string> ans;
    for(int i=0;i<words.size();i++){
        if(cnt[repr(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;
}

这个例子说明,没有良好的代码设计,是无法发挥STL的威力的。

如果没有想到标准化这个思路,就很难用map简化代码。

 

补充:

set头文件中的set和map头文件中的map分别是集合和映射。二者都支持 insert、 find、count 和 remove操作,

并且可以按照从小到大的顺序循环遍历其中的元素。

map还提供了  [] 运算符,使得map可以像数组一样使用。事实上,map也称为关联数组。

 

posted @ 2020-12-14 22:36  Vincent-yuan  阅读(118)  评论(0编辑  收藏  举报