原题:
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的所有字母得到的一个新单词。
示例 :
输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
思路分析:
1、判断是否是异位词
2、将同一类异位词存储起来
如何去判断两个字符串是不是异位词呢,分析实例中的字符串,在输出里面,nat和tan是异位词,他们都有一样的字母组成,n,a,t三个字母,那如果将nat和tan都看成字符串数组,并且统一按照自然排序的话,nat和tan都会被排序成a,n,t,这样就可以判断他们相同了,所以可以使用排序的方式,去存储每个字符串按照自然排序后的结果。
那么用什么来存这个排序后的内容呢,想了一下,排序后的内容,需要用来查询,因为属于异位词的字符串需要放到同一个数组里面。既需要存储排序后的字符串,又需要存储一个字符串数组,还要方便查询,那很容易就想到了用哈希表来存储Map<String,List<String>>。
由此分析完成,可以开始写代码了。
首先新建个类,SolutionGroupAnagrams,包含一个处理字符串并输出异位词结果的方法。
public class SolutionGroupAnagrams {
public List<List<String>> groupAnagrams(String[] strs){
}
}
只有一层for循环,对每个字符串进行排序,取到自然排序的字符串,并放入一个map里面。
public class SolutionGroupAnagrams {
public List<List<String>> groupAnagrams(String[] strs){
//解题思路
//将异位词的字母排序以后,同一组异位词的排序结果应该是一样的
//用排序结果作为key,List<String>作为value放入哈希表中
//使用哈希表存储,最后直接输出哈希表的vaules即可获得目标列表
Map<String,List<String>> map = new HashMap<>();
for(String str : strs){
char[] charArray = str.toCharArray();
Arrays.sort(charArray);
String key = new String(charArray);
List<String> list = map.getOrDefault(key, new ArrayList<String>());
list.add(str);
map.put(key,list);
}
return new ArrayList<>(map.values());
}
}