Question:
Given an array of strings, return all groups of strings that are anagrams.
Note: All inputs will be in lower-case.
Analysis:
In order to determine whether two words are anagrams or not, we can simply sort the words and check the sorted words are identical or not. If yes, they are anagrams, otherwise, they are not anagrams. But in order to save all the anagrams, we have to use hashMap. The key is sorted word, and the value is a list which contains all the words which is an anagram of the key.
public class Solution {
public ArrayList<String> anagrams(String[] strs) {
if(strs == null || strs.length < 2) return new ArrayList();
HashMap<String, ArrayList<String>> map = new HashMap();
for(String str : strs) {
String key = sortChars(str);
if(!map.containsKey(key)) {
map.put(key, new ArrayList<String>());
}
ArrayList<String> anagrams = map.get(key);
anagrams.add(str);
}
ArrayList<String> result = new ArrayList();
for(String key : map.keySet()) {
ArrayList<String> anagrams = map.get(key);
if(anagrams.size() > 1) {
result.addAll(anagrams);
}
}
return result;
}
public String sortChars(String str) {
char[] ch = str.toCharArray();
Arrays.sort(ch);
return new String(ch);
}
}
The code is from : https://gist.github.com/4005780