Given an array of strings, group anagrams together.
For example, given: ["eat", "tea", "tan", "ate", "nat", "bat"]
,
Return:
[ ["ate", "eat","tea"], ["nat","tan"], ["bat"] ]
Note:
- For the return value, each inner list’s elements must follow the lexicographic order.
- All inputs will be in lower-case.
以上是leetcode中该题的题目,意思是说给出一个string数组,要求把包含字母相同的string归为一类,并以List<List<String>>形式输出。比如“ate”“eat”“tea”这三个string都包含了a、e、t这三个字母,那么这三个string就放在同一个List中,最终输出多个这样的List。同时题目还要求同一个List中的各个string应该按照字典顺序排列,也就是a开头的string比z开头的string位置更靠前。
思路:hashmap的思想,如何才能将字母相同的归为一类,也就是说如何找key,可以先将string中的各个字母排好序,那么满足这个类的string的排好序的string一定完全相同,所以将排好序的string作为key,将满足这个key的所有string组成的list<String>作为value,最后将value中的list<String>排序且取出输出,即可。
Java解题:
public List<List<String>> groupAnagrams(String[] strs) {
List<List<String>> result = new ArrayList<List<String>>();
if(strs==null || strs.length==0)
return result;
Map<String,List<String>> map = new HashMap<String,List<String>>();
char[] c = null;
String s = "";
for(int i = 0 ;i<strs.length;i++){
List<String> temp_list = new ArrayList<String>();
c = strs[i].toCharArray();
Arrays.sort(c);
s = String.valueOf(c);
if(map.containsKey(s)){
temp_list=map.get(s);
temp_list.add(strs[i]);
}
else{
temp_list.add(strs[i]);
}
Collections.sort(temp_list);
map.put(s, temp_list);
}
Iterator<Entry<String, List<String>>> iter = map.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry entry = (Map.Entry) iter.next();
List<String> val = (List<String>) entry.getValue();
result.add(val);
}
return result;
}
最后,在Leetcode中,最上边还要加上:import java.util.Map.Entry;
才可以编译通过。