反片語(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()。

相關文章
相關標籤/搜索