49. Group Anagrams
Posted lyinfo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了49. Group Anagrams相关的知识,希望对你有一定的参考价值。
49. Group Anagrams
Given an array of strings, group anagrams together.
Example:
Input: ["eat", "tea", "tan", "ate", "nat", "bat"]
,
Output:
[
["ate","eat","tea"],
["nat","tan"],
["bat"]
]
Note:
- All inputs will be in lowercase.
- The order of your output does not matter.
看到题目第一反应,就是用key,value构造的Map进行分类。类似“eat”,"ate"的字符串既然能被分到一类,必然拥有相同的key,于是答案框架很快就写出来了。
public static List<List<String>> groupAnagrams(String[] strs) { List<List<String>> result = new ArrayList<>(); Map<String, List<String>> resMap = new HashMap<String, List<String>>(); for (int i = 0; i < strs.length; i++) { String sortString = sortString(strs[i]); if (resMap.containsKey(sortString)) { resMap.get(sortString).add(strs[i]); } else { List<String> temp = new ArrayList<>(); temp.add(strs[i]); resMap.put(sortString, temp); } } for (String list : resMap.keySet()) { result.add(resMap.get(list)); } return result; }
这里唯一的问题就是sortString()怎么实现,当然这是贴的AC后的代码才叫这个名字,这里的重点就是如何给属于同一类的字符串返回统一的key。当然首先想到的就是字母排序,但是又觉得排序是相当花时间的算法,有想过用char类型的ascii码值相加当key,即int sum = ‘a‘ + ‘t‘ + ‘e‘,但是sum相等,包含的字母也不一定一样,想了一会也没找到合适的办法,就先用排序实现了,后面有更好的解决办法再添加。
具体sortString()实现如下:
public static String sortString(String src) { char[] arr = src.toCharArray(); Arrays.sort(arr); return new String(arr); }
测试方法
public static void main(String[] args) { String[] strs = { "eat", "eat", "tan", "ate", "nat", "bat" }; System.out.println(groupAnagrams(strs).toString()); }
以上是关于49. Group Anagrams的主要内容,如果未能解决你的问题,请参考以下文章