Given an array of strings, group anagrams together.
For example, given: ["eat", "tea", "tan", "ate", "nat", "bat"]
,
Return:
[ ["ate", "eat","tea"], ["nat","tan"], ["bat"] ]法一:
遍历 strs数组,将字符串变成字符串数组 然后进行排序 将排序后的字符数组变成字符串 作为key保存到hash中,如果hash中没有这个key就put进去并且将字符串add
最后返回一个具有所有hashmap中value值的list
public class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
if(strs.length==0||strs==null) return new ArrayList<List<String>>();
HashMap<String,List<String>> map=new HashMap<>();
// List<List<String>> list=new ArrayList<List<Integer>>();
for(String s:strs){
char [] a=s.toCharArray();
Arrays.sort(a);
String str=String.valueOf(a);
// List<String> ll=new ArrayList<String>();
if(!map.containsKey(str)){
map.put(str,new ArrayList<>());
}
map.get(str).add(s);
}
return new ArrayList<List<String>>(map.values()); //map.values() 将hashmap中所有的value值放到list中
}
}
法二:
写一个hash化函数 把字符串转换成字符数组 并变成唯一的hashcode值作为key放到hashmap中
public int getID(String s){
int[] counter = new int[26];
for(char ch : s.toCharArray()){
counter[ch - 'a']++;
}
return Arrays.hashCode(counter); //use the counter array's hash code as this anagram's ID
}
//solution takes 18ms
public List<List<String>> groupAnagrams(String[] strs) {
List<List<String>> groups = new ArrayList<>();
Map<Integer, List<String>> anagramMap = new HashMap<>();
for(String word : strs){
int id = getID(word); //unique for each anagram
List<String> group = anagramMap.get(id);
if(null == group){
group = new ArrayList();
anagramMap.put(id, group);
}
group.add(word);
}
groups.addAll(anagramMap.values());
return groups;
}
法三:
建一个26长度的数组 里面是26个不同的质数
记录每个字符串字符对应的数组值的乘积,作为key 不同的字符组合这个乘积值一定是唯一的
public static List<List<String>> groupAnagrams(String[] strs) {
int[] prime = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103};//最多10609个z
List<List<String>> res = new ArrayList<>();
HashMap<Integer, Integer> map = new HashMap<>();
for (String s : strs) {
int key = 1;
for (char c : s.toCharArray()) {
key *= prime[c - 'a'];
}
List<String> t;
if (map.containsKey(key)) {
t = res.get(map.get(key));
} else {
t = new ArrayList<>();
res.add(t);
map.put(key, res.size() - 1);
}
t.add(s);
}
return res;