现在的位置: 首页 > 综合 > 正文

LeetCode题解:Anagrams

2018年03月31日 ⁄ 综合 ⁄ 共 894字 ⁄ 字号 评论关闭

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;
    }

抱歉!评论已关闭.