Q:
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.
思路:遍历strs. 遍历到strs[i]的时候,先将它排序,然后以排序后的值作为key,从hashmap中get(key)如果有key对应的value(List<String>),则List<String>.add(strs[i]), 由于JVM的设计,对象是引用的,所以这里不必再put到hashmap中,提高效率.
否则new一个List<String>,并add(strs[i]). 然后将List<String>put到hashmap中.
最后输出hashmap的value即可.
代码:
int length = strs.length;
List<List<String>> list = new ArrayList<>(length);
HashMap<String, List<String>> map = new HashMap<>();
for (int i = 0; i < length; i++) {
String valStr = strs[i];
char[] charArray = valStr.toCharArray();
Arrays.sort(charArray);
String keyStr = Arrays.toString(charArray);
List<String> listOfMap = map.get(keyStr);
if (listOfMap == null) {
listOfMap = new ArrayList<>();
listOfMap.add(valStr);
map.put(keyStr, listOfMap);
} else {
listOfMap.add(valStr);
}
}
Set<Entry<String, List<String>>> entrySet = map.entrySet();
for (Entry<String, List<String>> entry : entrySet) {
list.add(entry.getValue());
}
return list;