您的位置:首页 > 其它

LeetCode题解:Anagrams

2013-10-26 15:11 357 查看

Anagrams

Given an array of strings, return all groups of strings that are anagrams.
Note: All inputs will be in lower-case.

思路:

关键在于对题目的理解。本文中anagrams指只有字母排列顺序不同的单词,例如eat,ate,tea。倘若有多组anagrams,那么返回所有的anagrams。两个空字符串也算一对anagrams。那么这个问题就可以使用hash的方法来解决。有很多种不同的hash方法,可以马上想到的有排过序的字符串作为hash key,或者按字母计数生成一个hash key。这里采用后者。

题解:

class Solution {
public:
struct StringHash
{
char hash[26];

StringHash(const string& str)
{
fill(hash, hash+26, 0);
for(auto& ch : str)
++ hash[ch - 'a'];
}

bool operator<(const StringHash& sh) const
{
for(size_t i = 0; i < 26; ++i)
if ( this->hash[i] < sh.hash[i] )
return true;
else if ( this->hash[i] > sh.hash[i] )
return false;
return false;
}
};

vector<string> anagrams(vector<string> &strs)
{
map<StringHash, vector<vector<string>::iterator>>  hash_map;

for(auto iter=begin(strs); iter != end(strs); ++iter)
hash_map[StringHash(*iter)].push_back(iter);

vector<string> ret;
for(auto hsm : hash_map)
if (hsm.second.size() >= 2)
for(auto i : hsm.second)
ret.push_back(*i);

return ret;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: