典型的用HashMap来存单次。。。单词的解析码是所有字母排序相同的值。
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.util.HashMap;
import java.util.Arrays;
// import container 时,要import 接口和对应的子类。。。Arrays是个常用的类哦。。
public class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
// 这题的意思是找到字母出现次数一样的词,但是字母位置不一样,放在一个集合里。
// 既然是集合,那就是用List来存储咯,container用处确实广泛
// 但是核心的部分是 用什么数据结构+对应算法 来判断anagrams。
// 简单的思路是:如果不是anagram,则新建一个element集合;如果是,就在该element集合内添加新成员;
// 为每一个str建立 pair<set<Character>, String>; 新建一个Map<set<Character>, String[]>; 最后遍历map,把String[]改装成题目需要的形式。。。
// 看了四火的解答,跟我的思路是一样的,其实就是ECS124课上最后一个HW,看来ECS124TA还是没白当
// 四火的解答,聪明之处在于,找到所有anagrams对应的一个公共key,就是字母顺序排列好的String,等同与ECS124HW4里的kmer
// 比我的Set<Character> 在思路和实现方法上都简单一些。
if(strs.length==0) return null;
Map<String, List<String>> map= new HashMap<String, List<String>>();
for(String s: strs){
// create a search key, s_key, for every string, anagrams should have the same s_key;
char[] s_charArray= s.toCharArray();
Arrays.sort(s_charArray);
String s_key= new String(s_charArray);
if(!map.containsKey(s_key)) map.put(s_key, new ArrayList<String>()); // here is new ArrayList<String>, not new List<String> !!你忘了最后的(), 这是constructor!!! 无参constructor很容易忘了()
map.get(s_key).add(s);
}
List<List<String>> result = new ArrayList<List<String>>(); // !!! new 后面不能加接口,要加子类!!!
/* for(Map.Entry<String, List<String>> listStr: map.entrySet()){
result.add(listStr.getValue());
}*/ // the following is an easy to understand way.
for(String str: map.keySet()){
result.add(map.get(str));
}
return result;
}
}