Given an array of strings, group anagrams together.
Example:
Input: ["eat", "tea", "tan", "ate", "nat", "bat"]
,
Output:
[
["ate","eat","tea"],
["nat","tan"],
["bat"]
]
问题:
已知一组字符串,将所有anagram(由颠倒字母顺序而构成的字)放到一起输出。
如:["eat", "tea", "tan", "ate", "nat", "bat"]
返回: [["ate", "eat", "tea"], ["nat", "tan"], ["bat"]]
思路:
建立字符串到字符串向量的哈希表。遍历字符串向量,并对每个字符排序,从而能将乱序的字符变成顺序,如["ate", "eat", "tea"]都会变成aet,建立aet字符与一个空字符串链表的映射,再插入字符即可。
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
if(strs.length == 0 || strs == null)
return new ArrayList<List<String>>();
Map<String, List<String>> map = new HashMap<String, List<String>>(); //建立字符->字符列表的map
for(String s : strs)
{
char[] s_char = s.toCharArray();
Arrays.sort(s_char); //对当前字符串中字符排序
String keyStr = String.valueOf(s_char);
if(! map.containsKey(keyStr)) //如果map中不存在当前字符与字符列表的对应
map.put(keyStr, new ArrayList<String>()); //新建一个映射关系,即当前字符与空链表的映射
// else 为什么加了else是错的?因为当发现map中不存在当前字符与字符列表的对应时,只是新建了一个映射,没有把当前字符存入,所以第一个字符都没存进去
map.get(keyStr).add(s);
}
return new ArrayList<List<String>>(map.values());
}
}
//for(String s : strs) 等同于:
for (int i = 0; i < str.length; i++) {
String s = str[i];
System.out.print(s);
博主学习笔记,转载请注明出处,谢谢~