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


    July-17-2019

    第一反应是每个String都sort一下,然后分类,事实上也是正确的。。
    Time: O(n KlgK)
    Space: O(nk)
    k = length of word

    class Solution {
        public List<List<String>> groupAnagrams(String[] strs) {
    
            Map<String, List<String>> m = new HashMap<>();
            for (String s : strs) {
                char[] chars = s.toCharArray();
                Arrays.sort(chars);
                String tempKey = new String(chars);
                if (!m.containsKey(tempKey)) {
                    m.put(tempKey, new ArrayList<>());
                }
                m.get(tempKey).add(s);
            }
    
            return new ArrayList<>(m.values());
        }
    }
    

    上面其实没用Anagram的另一个特性,char出现的次数相等就行,所以sort的KlgK其实浪费了,我们只要算出每个字母出现的次数然后作为Map里的key就行。

    时间上:KlgK => 26K
    Time: O(nK*26)

        public List<List<String>> groupAnagrams(String[] strs) {
            Map<String, List<String>> map = new HashMap<>();
            int[] charCount = new int[26];
            StringBuilder keyBuilder = new StringBuilder();
            for (String s : strs) {
                Arrays.fill(charCount, 0);
                for (char c : s.toCharArray()) {
                    charCount[c - 'a'] ++;
                }
                keyBuilder = new StringBuilder();
                for (int i = 0; i < 26; i ++) {
                    keyBuilder.append(charCount[i]).append((char)(i + 'a'));
                }
                String tempKey = keyBuilder.toString();
                if (!map.containsKey(tempKey)) map.put(tempKey, new ArrayList<>());
                map.get(tempKey).add(s);
            }
            return new ArrayList<>(map.values());
        }
    


    三刷。

    印象很深,秒之。。
    利用anagram的单词sort之后的结果是一样的。

    建立一个< String, List< String >>的map,每个string都先sort一下,然后所有sort之后和这个一样的放到一个list里。。

    最后按list添加就行了。。

    Time Complexity: O(k nlgn) K个单词,每个排序nlgn
    Space Complexity: O(nk) 所有单词存到MAP里。

    public class Solution {
        public List<List<String>> groupAnagrams(String[] strs) {
            List<List<String>> res = new ArrayList<>();
            Map<String, List<String>> map = new HashMap<>();
            
            for (int i = 0; i < strs.length; i++) {
                char[] ch = strs[i].toCharArray();
                Arrays.sort(ch);
                String tempStr = new String(ch);
                if (map.containsKey(tempStr)) {
                    map.get(tempStr).add(strs[i]);
                } else {
                    List<String> l = new ArrayList<>();
                    l.add(strs[i]);
                    map.put(tempStr, l);
                }
            }
            
            for (String s: map.keySet()) {
                res.add(map.get(s));
            }
            return res;
            
        }
    }
    
  • 相关阅读:
    Java线程池,你了解多少?
    Git-常用命令
    CentOS6.6 编译Redis报错:"Newer version of jemalloc required"
    IDEA 常用快捷键
    Java并发编程(4)--生产者与消费者模式介绍
    CSS样式----浮动(图文详解)
    实现键盘记录的e.Whick和keyCode,兼容FireFox和IE
    如何用Fireworks制作经典的扫光字GIF动画
    asp.net中label控件设置字体大小
    [HttpException (0x80004005): 应用程序已预编译,因此不允许使用目录“/App_Code/”。]
  • 原文地址:https://www.cnblogs.com/reboot329/p/6073310.html
Copyright © 2011-2022 走看看