思路:哈希表分组。
1.题目要求:如果两个字符串从小到大排序后相等,那么这两个字符串就互为字母异位词,否则不是。
2.举例:以示例1为例。输入:strs = [eat,tea,tan,ate,nat,bat]。
(1)每个字符串各自排序,得到aet,aet,ant,aet,ant,abt。
(2)把排序后相同的字符串分到同一组:
——排序后是aet的字符串,排序前是eat,tea,ate。
——排序后是ant的字符串,排序前是tan,nat。
——排序后是abt的字符串,排序前是bat。
(3)因此,示例1返回的二维列表中,包含三个列表,分别为:[eat,tea,ate],[tan,nat],[bat],三个列表的顺序随意。
附代码:
class Solution { public List<List<String>> groupAnagrams(String[] strs) { Map<String,List<String>> map = new HashMap<>(); for(int i = 0;i < strs.length;i++){ //把字符串数组strs中的每一个字符串都转换为字符数组chars char[] chars = strs[i].toCharArray(); //把每一个chars都按字母顺序排序 Arrays.sort(chars); //将排序后的字符数组重新组合成字符串,作为HashMap的键 //toString返回的是数组对象的哈希地址,new String(chars)才是使用String的构造函数从字符数组创建一个新的字符串 String key = new String(chars); //如果键不存在,就创建新列表 if(!map.containsKey(key)){ map.put(key,new ArrayList<String>()); } //获得当前键对应的列表 //将当前字符串添加到当前字符串列表中 map.get(key).add(strs[i]); } //将哈希表的所有的值收集起来,组成一个新的列表并返回 return new ArrayList(map.values()); } }