今天再看這個題時,死活想不起這個單詞是什麼意思,查了字典都不知道,真暈了。
這個單詞直譯是顛倒順序所形成的單詞,實際上就是從集合中找出所有是由一組字母形成的那些單詞,這種可以由很多組,即只要這組字母形成的字典中的單詞多於1個,就要把這些單詞輸出出來。
怎麼做呢?思路還是很簡單的,要找出是由一組字母形成的單詞,顯然應該知道每一個單詞是由哪些字母形成的,這當然可以建一個hash表,每次都比對hash表中的每一個位置的個數是不是相等,有沒有更好的辦法呢?有的,就是把這個hash錶轉化成一個string,這樣看看string是不是相等的。那怎麼轉化呢?我用的方式是stringstream,這個流大家不是很熟悉,但是我發現它幾乎是string與int之間轉化最方便的工具了,可以把int餵給它,然後讓他吐出string,好神奇。每個單詞都可以計算這樣一個string形式的hash表,把這個string作為map中的鍵,然後相同的那些單詞可以放入對應的value,輸出的時候,看一下後面value的size,大於1就輸出出來,是不是很粗暴。
用這種方法一開始逾時了,後來才發現是轉化hash表的那裡,修改了一下就好了,這種寫法應該比較有適應性,注意每一個字母的個數之間最後插入一個特殊字元,防止連在一起產生錯誤。
string changeToString(int* t){ ostringstream ss; for(int i=0;i<26;i++){ ss<<t[i]<<"-"; } return ss.str();}class Solution {public: vector<string> anagrams(vector<string> &strs) { vector<string> res; int len = strs.size(); if(len<=1) return res; map<string, vector<int> > smap; int t[30]; for(int i=0;i<len;i++){ memset(t, 0, sizeof(t)); for(int j=0;j<strs[i].length();j++){ t[strs[i][j]-'a']++; } smap[changeToString(t)].push_back(i); } map<string, vector<int> >::const_iterator it = smap.begin(); while(it != smap.end()){ int tplen = (it->second).size(); if(tplen>1){ for(int i=0;i<tplen;i++) res.push_back(strs[(it->second)[i]]); } it++; } return res; }};