题目描述:
给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。
示例: 输入: ["eat", "tea", "tan", "ate", "nat", "bat"], 输出: [ ["ate","eat","tea"], ["nat","tan"], ["bat"] ]
说明:
所有输入均为小写字母。
不考虑答案输出的顺序。
题目解析:
这道题关键在于,如何找到可以唯一标识具有相同字母并且个数也一样的键,单词按字典顺序排序
代码实现:
import java.util.*; /** * @author yaoshw */ public class Main { public static void main(String[] args) { String[] strings = {"eat", "tea", "tan", "ate", "nat", "bat"}; groupAnagrams(strings).forEach(System.out::println); } public static List<List<String>> groupAnagrams(String[] strs) { if (strs == null || strs.length == 0) { return new ArrayList<>(); } Map<String, List<String>> map = new HashMap<>(16); for (String str : strs) { char[] charStr = str.toCharArray(); //按照字典序进行排序 Arrays.sort(charStr); String key = String.valueOf(charStr); if (!map.containsKey(key)) { map.put(key, new ArrayList<>()); } //将当前字符串添加到以key为键的map集合中 map.get(key).add(str); } return new ArrayList<>(map.values()); } }
时间复杂度:O(NKlogK),其中 N是 strs 的长度,而 K 是 strs 中字符串的最大长度。当我们遍历每个字符串时,外部循环具有的复杂度为 O(N)。然后,我们在 O(KlogK) 的时间内对每个字符串排序。
空间复杂度:O(NK),排序存储在 map中的全部信息内容。