package highFrequencyLeetcode.leetcode_49; import java.util.*; /** *

* * 给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。 * * 示例: * * 输入: ["eat", "tea", "tan", "ate", "nat", "bat"], * 输出: * [ * ["ate","eat","tea"], * ["nat","tan"], * ["bat"] * ] * * 说明: * * 所有输入均为小写字母。 * 不考虑答案输出的顺序。 * *

* * @author Seina * @version 2019-06-16 12:57:00 */ public class GroupAnagrams { /** * 解法1 排序数组分类 * * 将排好序的数组放在 map 集合里,并存储在结果集合里面的索引位置 * * @param strs: 字符出数组 * @return 字母异位词的集合 */ public List> groupAnagrams1(String[] strs){ List> resultList = new ArrayList>(); //key: 排序后的字符串 value:res 中的索引位置 //按照题目给的例子,map 应该是 (ate, 0) (ant, 1) (abt, 3) Map map = new HashMap(); for (String str : strs) { //先排序 String sortedStr = sort(str); //去 map 里面找,看看有没有属于自己的索引位置 Integer index = map.get(sortedStr); if (index == null) { //如果没有,新建一块属于自己的位置(字母异位词的集合) List list = new ArrayList(); list.add(str); resultList.add(list); map.put(sortedStr, resultList.size() - 1); } else { //如果有,取出自己的索引位置,直接加入字母异位词的集合 resultList.get(index).add(str); } } return resultList; } //字符串排序 private String sort(String s) { //string -> array char[] ca = s.toCharArray(); Arrays.sort(ca); //array -> string return new String(ca); } /** * 解法2 排序数组分类(力扣官方题解) * * 将排好序的数组放在 map 的 key 里,然后将字母异位词的集合放在 value 里 * * @param strs: 字符出数组 * @return 字母异位词的集合 */ public List> groupAnagrams2(String[] strs){ if (strs.length == 0) return new ArrayList>(); Map map = new HashMap(); for (String s : strs) { char[] ca = s.toCharArray(); Arrays.sort(ca); String key = String.valueOf(ca); //key: 排序后的数组 value:字母异位词的集合 if (!map.containsKey(key)) map.put(key, new ArrayList>()); map.get(key).add(s); } return new ArrayList(map.values()); } }