您的位置:首页 > 其它

49 Group Anagrams

2015-09-29 21:49 197 查看
题目链接:https://leetcode.com/problems/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:
For the return value, each inner list's elements must follow the lexicographic order.
All inputs will be in lower-case.


解题思路:

题目的意思很明白,就是把具有相同字符的字符串放在同一个子列表中。

判断两个字符串由相同的字符组成(字符之间的顺序未必相同)的方法,就是对字符串进行排序,使它们成为相同的字符串。

为了能快速找到字符串的同伴(包含同类字符串的列表),把它们都放在一个 HashMap < String,list> 中,其中键为排过序的字符串,值为与键具有相同字符的未排序的字符串。这样,我们对数组中的字符串本身先排序,再以已排序的串作为键来查找其归属的列表,最后把未排序的串加入到 list 中。

题目还要求在每个子列表中,字符串要按字典序排列。使用

Collections.sort(list, new  Comparator<String>() {
public int compare(String a, String b)
return a.compareTo(b);
});


对列表元素排序。

需要注意的是,重写的 compare 方法是 public 的,不写 public 默认包访问权限小于原本的公有权限,会报编译错误。

代码实现:

public class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
List<List<String>> res = new ArrayList();
if(strs == null || strs.length == 0)
return res;
HashMap<String, List<String>> map = new HashMap();
for(String str : strs) {
char[] strtemp = str.toCharArray();
Arrays.sort(strtemp);
String sortStr = String.valueOf(strtemp);
if(map.containsKey(sortStr))
map.get(sortStr).add(str);
else {
List<String> list = new ArrayList();
list.add(str);
map.put(sortStr, list);
}
}
for(Map.Entry<String, List<String>> m : map.entrySet()) {
List<String> list = m.getValue();
Collections.sort(list, new Comparator<String>() {
public int compare(String a, String b) {
return a.compareTo(b);
}
});
res.add(list);
}
return res;
}
}


100 / 100 test cases passed.
Status: Accepted
Runtime: 29 ms
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: