Given an array of strings, return all groups of strings that are anagrams.
Note: All inputs will be in lower-case.
这是我找到的最喜欢的解法。这个方法的精髓在于,设计一个HashMap,其中的Key用我们的sort过的String来代替。因为如果两个String 是 Anagrams,也就说明他们包含的字母内容完全一样,只是顺序改变了。
/*
The idea is to use a hashmap to collect groups of anagrams.
The way to determine whether two strings are anagrams is to sort them
and see if sorted strings are identical.
*/
import java.util.*;
public class Solution {
public ArrayList<String> anagrams(String[] strs) {
// Start typing your Java solution below
// DO NOT write main() function
ArrayList<String> result = new ArrayList<String>();
HashMap<String,ArrayList<String>> map = new HashMap<String,ArrayList<String>>();
for(String str : strs){
char[] tempstr= str.toCharArray();
Arrays.sort(tempstr);
String sortedstr = new String(tempstr);
if(map.containsKey(sortedstr)){
map.get(sortedstr).add(str);
}else{
ArrayList<String> list = new ArrayList<String>();
list.add(str);
map.put(sortedstr,list);
}
}
for(ArrayList<String> list:map.values())
if(list.size()>1)
for(String str : list)
result.add(str);
return result;
}
}