Given an array of strings, return all groups of strings that are anagrams.
Note: All inputs will be in lower-case.
Sort each string, and store the sorted string as a key in a hashmap. And store all the strings that generate the same sorted string in an array list as the value of that key. All the values whose size is larger than 1 have anagrams. Time complexity O(nklogk), space O(nk), n is number of strings, k is the largest length of the strings.
public class Solution {
public ArrayList<String> anagrams(String[] strs) {
ArrayList<String> res = new ArrayList<String>();
if (strs == null || strs.length == 0) {
return res;
}
HashMap<String, ArrayList<String>> map = new HashMap<String, ArrayList<String>>();
for (int i = 0; i < strs.length; i++) {
char[] chars = strs[i].toCharArray();
Arrays.sort(chars);
String str = new String(chars);
if (map.containsKey(str)) {
map.get(str).add(strs[i]);
} else {
ArrayList<String> item = new ArrayList<String>();
item.add(strs[i]);
map.put(str, item);
}
}
for (String s : map.keySet()) {
if (map.get(s).size() > 1) {
res.addAll(map.get(s));
}
}
return res;
}
}