Leetcode - Group Anagrams

My code:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;

public class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
        if (strs == null)
            return null;
        ArrayList<List<String>> result = new ArrayList<List<String>>();
        ArrayList<String> group = new ArrayList<String>();
        if (strs.length == 0) {
            return result;
        }
        Arrays.sort(strs);
        HashMap<String, ArrayList<Integer>> hm = new HashMap<String, ArrayList<Integer>>();
        
        for (int i = 0; i < strs.length; i++) {
            char[] tempCharArray = strs[i].toCharArray();
            Arrays.sort(tempCharArray);
            String tempStr = String.valueOf(tempCharArray);
            if (!hm.containsKey(tempStr)) {
                ArrayList<Integer> tempArrayList = new ArrayList<Integer>();
                tempArrayList.add(i);
                hm.put(tempStr, tempArrayList);
            }
            else {
                ArrayList<Integer> tempArrayList = hm.get(tempStr);
                tempArrayList.add(i);
                hm.put(tempStr, tempArrayList);
            }
        }
        
        for (ArrayList<Integer> temp : hm.values()) {
            for (Integer index : temp)
                group.add(strs[index]);
            result.add(new ArrayList<String>(group));
            group = new ArrayList<String>();
        }
        return result;
    }
    
    public static void main(String[] args) {
        Solution test = new Solution();
        String[] a = {"a"};
        System.out.println(test.groupAnagrams(a));
    }
}

My test result:

Paste_Image.png

首先说下测试结果为什么这么慢。我的理解是,这道题目是8.9才改题的,之前的用户数据可能还保存着,导致我的排名很低。但其实,题目改了之后,复杂度就变了。
这道题目感觉学到了很多。

  1. 如何对 string 排序, 利用java API
char[] arr = str.toCharArray();
Arrays.sort(arr);
String s = String.valueOf(arr);
  1. 用什么去接收Collections 类。 如何获得 HashMap values 的迭代器,使用 .values() 方法
    如果value是 T 类型。那么,
for (T temp : hashmap.values())
  ......
  1. new ArrayList<Integer>(5); 并不能生成一个 含有 5 的链表。必须要先new一个新的arraylist,然后再插入5进去。

**
总结: String, HashMap, Collections, string sort
**

Anyway, Good luck, Richardo!

My code:

public class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
        ArrayList<List<String>> ret = new ArrayList<List<String>>();
        if (strs == null || strs.length == 0)
            return ret;
        /** key: sorted string  value: list for string, convenient for sorting later */
        HashMap<String, ArrayList<String>> tracker = new HashMap<String, ArrayList<String>>();
        for (int i = 0; i < strs.length; i++) {
            String curr = strs[i];
            char[] currChar = curr.toCharArray();
            Arrays.sort(currChar);
            curr = new String(currChar);
            if (tracker.containsKey(curr)) {
                List<String> list = tracker.get(curr);
                list.add(strs[i]);
            }
            else {
                ArrayList<String> list = new ArrayList<String>();
                list.add(strs[i]);
                tracker.put(curr, list);
            }
        }
        /** traverse the key set of hashmap, sort sub list and add into ret */
        for (String key : tracker.keySet()) {
            ArrayList<String> list = tracker.get(key);
            Collections.sort(list);
            ret.add(list);
        }
        return ret;
    }
}

这道题木卡了一会儿。问题出在哪里?
char[] tmp = ...
tmp.toString() 返回的是该数组的内存地址,而不是转换而来的 String!!
一定要当心。
其他没什么问题了。
对数组排序,
Arrays.sort();
对链表排序,
Collections.sort();

Anyway, Good luck, Richardo!

My code:

public class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
        List<List<String>> ret = new ArrayList<List<String>>();
        HashMap<String, List<String>> map = new HashMap<String, List<String>>();
        for (int i = 0; i < strs.length; i++) {
            char[] arr = strs[i].toCharArray();
            Arrays.sort(arr);
            String s = String.valueOf(arr);
            if (map.containsKey(s)) {
                map.get(s).add(strs[i]);
            }
            else {
                map.put(s, new ArrayList<String>());
                map.get(s).add(strs[i]);
            }
        }
        
        for (String ss : map.keySet()) {
            Collections.sort(map.get(ss));
        }
        
        for (String ss : map.keySet()) {
            ret.add(map.get(ss));
        }
        return ret;
    }
}

并不难,但复杂度不小,因为每个string都需要sort

后来看到了一个新的方法,更高效,利用hashcode 的思想。
统计每个字母的个数与 int[26] nums
然后Arrays.hashCode(nums) 拿到哈希值作为hashtable的key

My code:

public class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
        List<List<String>> ret = new ArrayList<List<String>>();
        if (strs == null || strs.length == 0) {
            return ret;
        }
        HashMap<Integer, List<String>> map = new HashMap<Integer, List<String>>();
        for (int i = 0; i < strs.length; i++) {
            int id = getID(strs[i]);
            if (!map.containsKey(id)) {
                map.put(id, new ArrayList<String>());
            }
            map.get(id).add(strs[i]);
        }
        
        for (Integer i : map.keySet()) {
            ret.add(map.get(i));
        }
        return ret;
    }
    
    private int getID(String s) {
        int[] nums = new int[26];
        for (int i = 0; i < s.length(); i++) {
            nums[s.charAt(i) - 'a']++;
        }
        return Arrays.hashCode(nums);
    }
}

reference:
https://discuss.leetcode.com/topic/56803/beat-90-2-18ms-o-n-non-sort-solutions-with-hashmap

Anyway, Good luck, Richardo! -- 09/20/2016

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,496评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,407评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,632评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,180评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,198评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,165评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,052评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,910评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,324评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,542评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,711评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,424评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,017评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,668评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,823评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,722评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,611评论 2 353

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,743评论 0 33
  • 听说这是一个高频考题哈哈 从给的array里,把是anagram的组成一个list。 这个题看起来简单,做起来也没...
    98Future阅读 338评论 0 0
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,623评论 18 399
  • 个人笔记,方便自己查阅使用 Contents Java LangAssignment, ReferenceData...
    freenik阅读 1,382评论 0 6
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,651评论 18 139