Problem
Given an array of strings, return all groups of strings that are anagrams.
Notice
All inputs will be in lower-case
Example
Given ["lint", "intl", "inlt", "code"]
, return ["lint", "inlt", "intl"]
.
Given ["ab", "ba", "cd", "dc", "e"]
, return ["ab", "ba", "cd", "dc"]
.
Note
对变形词的查找和归类,可以将自然排序的词根和所有同根变形词成对存入哈希表map
里。然后,返回map.values()
里size
大于1的字符串数组,再存入结果数组res
。注意res并不是ArrayList<ArrayList<String>>()
的结构,而是和list
数组相同的ArrayList<String>()
,所以存list
到res
一定要用addAll()
方法。
有几行容易出错的语句,可以注意一下:
char[] temp = str.toCharArray();
String sortedstr = new String(temp);
for (ArrayList<String> str: map.values()) {};
res.addAll(list);
Solution
public class Solution {
public List<String> anagrams(String[] strs) {
List<String> res = new ArrayList<String>();
HashMap<String, ArrayList<String>> map = new HashMap<String, ArrayList<String>>();
for (String str: strs) {
char[] temp = str.toCharArray();
Arrays.sort(temp);
String sortedstr = new String(temp);
if (map.containsKey(sortedstr)) {
ArrayList<String> list = map.get(sortedstr);
list.add(str);
map.put(sortedstr, list);
}
else {
ArrayList<String> list = new ArrayList<String>();
list.add(str);
map.put(sortedstr, list);
}
}
for (ArrayList<String> list: map.values()) {
if (list.size() > 1) res.addAll(list);
}
return res;
}
}