反片语(Ananagrams,Uva 156)

  输入一些单词,找出全部知足以下条件的单词:该单词不能经过字母重排,获得输入文 本中的另一个单词。在判断是否知足条件时,字母不分大小写,但在输出时应保留输入中 的大小写,按字典序进行排列(全部大写字母在全部小写字母的前面)。 ios

  样例输入:数组

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 # ide

  样例输出: spa

Disk 设计

NotE code

derail blog

drIed 排序

eye ci

ladder rem

soon

【分析】 把每一个单词“标准化”,即所有转化为小写字母后再进行排序,而后再放到map中进行统 计。代码以下: 

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

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

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简化代码。

   map就是从键(key)到值(value)的映射。由于重载了[ ]运算符,map像是数组的“高 级版”。例如能够用一个map<string,int>month_name来表示“月份名字到月份编号”的映射, 而后用month_name["July"]=7这样的方式来赋值。

  set头文件中的set和map头文件中的map分别是集合与映射。两者都支持 insert、find、count和remove操做,而且能够按照从小到大的顺序循环遍历其中的元素。 map还提供了“[]”运算符,使得map能够像数组同样使用。事实上,map也称为“关联数 组”。

  注:

  使用count,返回的是被查找元素的个数。若是有,返回1;不然,返回0。注意,map中不存在相同元素,因此返回值只能是1或0。

  使用find,返回的是被查找元素的位置,没有则返回map.end()。

相关文章
相关标签/搜索