zoukankan      html  css  js  c++  java
  • 49. Group Anagrams

    Given an array of strings, group anagrams together.

    For example, given: ["eat", "tea", "tan", "ate", "nat", "bat"]
    Return:

    [
      ["ate", "eat","tea"],
      ["nat","tan"],
      ["bat"]
    ]

    Note: All inputs will be in lower-case.

    分析


    这里并没有要求每组 anagram 内部排序,所以只需要把 anagram放到同一组中即可,想到的方法是每种 anagram,都对应唯一的 key 值,这里看到有两种
    1. 字母内部排序,得到 以字母为key
    2. 为26个英文字母,对应26个质数,

    算法1

    每个string排序当key,不考虑vector<string> 内部排序 (使用vector<string>当value)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    class Solution {
    public:
        vector<vector<string>> groupAnagrams(vector<string>& strs) {
            unordered_map<string, vector<string>> map;
            for(auto s: strs){
                string key = s;
                sort(key.begin(), key.end());
                map[key].push_back(s);
            }
            vector<vector<string>> anagrams;
            for(auto m:map){
                anagrams.push_back(m.second);
            }
            return anagrams;
        }
    };

    使用string排序当key,考虑vector<string>内部排序。(使用multiset当 value)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    class Solution {
    public:
        vector<vector<string>> groupAnagrams(vector<string>& strs) {
            unordered_map<string, multiset<string>> map;
            for(auto s: strs){
                string key = s;
                sort(key.begin(), key.end());
                map[key].insert(s);
            }
            vector<vector<string>> anagrams;
            for(auto m:map){
                vector<string> anagram(m.second.begin(), m.second.end());
                anagrams.push_back(anagram);
            }
            return anagrams;
        }
    };

    算法2

    使用26个质数对应26个字母,乘积作为 key值,
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    class Solution {
    public:
        int prime[26] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103};
        vector<vector<string>> groupAnagrams(vector<string>& strs) {
            unordered_map<long, vector<string>> map;
            for(auto s: strs){
                map[hash_value(s)].push_back(s);
            }
            vector<vector<string>> result;
            for(auto m: map){
                result.push_back(m.second);
            }
            return result;
        }
         
        long hash_value(string s){
            long value = 1;
            for(auto c: s){
                value *=prime[c-'a'];
            }
            return value;
        }
    };




  • 相关阅读:
    【转载】浮点数在内存中的存储格式
    流媒体完全手册
    Windows Mobile 5.0 SDK 下载地址
    实时传输协议 RTP
    JDK环境变量配置
    扩展Windows Mobile模拟器存储空间的方法
    WinSock学习笔记
    实时传输协议 RTCP
    NHibernate从入门到精通系列(4)——持久对象的生命周期(上)
    实时流协议 RTSP
  • 原文地址:https://www.cnblogs.com/zhxshseu/p/f87c737b95b7e58c7ca48936fee74b9e.html
Copyright © 2011-2022 走看看