青岛微网站,为什么百度搜索不到我的网站,word和wordpress,与网站建立的链接不安全怎么办大家好#xff0c;今天深度拆解力扣中等题「字母异位词分组」的两种核心解法 ——排序法#xff08;简洁易实现#xff09; 和计数法#xff08;高效优化版#xff09;#xff0c;并对比两者的适用场景#xff0c;帮你彻底掌握这道经典题#xff01;一、题目回顾给定一…大家好今天深度拆解力扣中等题「字母异位词分组」的两种核心解法 ——排序法简洁易实现和计数法高效优化版并对比两者的适用场景帮你彻底掌握这道经典题一、题目回顾给定一个字符串数组strs将字母异位词字母种类 / 数量相同、排列不同的字符串分组返回所有分组后的列表。示例输入[eat,tea,tan,ate,nat,bat]→ 输出[[eat,tea,ate],[tan,nat],[bat]]。二、核心思路给异位词 “打标签”字母异位词的核心特征是「字符组成完全相同」因此只要能给每组异位词生成唯一的标签key就能用哈希表实现分组。两种解法的本质都是 “生成唯一 key 哈希表分组”区别仅在于「生成 key 的方式」。三、方案 1排序法简洁易上手1. 核心逻辑将每个字符串的字符排序异位词排序后会得到相同的字符串如eat/tea排序后都是aet以此作为哈希表的 key。2. 代码实现import java.util.*; class Solution { // 排序法简洁易实现适合字符串较短的场景 public ListListString groupAnagrams(String[] strs) { // key排序后的字符串value对应异位词列表 MapString, ListString map new HashMap(); for (String str : strs) { // 1. 字符数组排序生成唯一key char[] chars str.toCharArray(); Arrays.sort(chars); String key new String(chars); // 2. 哈希表分组无则新建列表有则直接添加 ListString list map.getOrDefault(key, new ArrayList()); list.add(str); map.put(key, list); } // 3. 提取所有分组结果 return new ArrayList(map.values()); } }3. 复杂度分析时间复杂度O(n×k log k)n 字符串数量k 字符串最大长度排序单字符串的时间是O(k log k)遍历 排序整体为O(n×k log k)。空间复杂度O(n×k)存储哈希表的键和所有字符串。4. 适用场景字符串长度k较小如 k≤20追求代码简洁性无需极致性能。四、方案 2计数法高效优化版1. 核心逻辑排序法的瓶颈在 “字符排序”计数法直接统计每个字符串中 26 个字母的出现次数如eat的计数为a:1, e:1, t:1将计数结果拼接成唯一 key把单字符串处理时间从O(k log k)降至O(k)。2. 代码实现import java.util.*; class Solution { // 计数法时间优化版适合字符串较长的场景 public ListListString groupAnagrams(String[] strs) { MapString, ListString map new HashMap(); for (String str : strs) { // 1. 初始化26字母计数数组a-z对应下标0-25 int[] count new int[26]; // 2. 统计每个字符出现次数 for (char c : str.toCharArray()) { count[c - a]; // a→0b→1以此类推 } // 3. 生成唯一key用逗号分隔避免数字歧义如11和11 StringBuilder sb new StringBuilder(); for (int num : count) { sb.append(num).append(,); } String key sb.toString(); // 4. 哈希表分组逻辑同排序法 ListString list map.getOrDefault(key, new ArrayList()); list.add(str); map.put(key, list); } return new ArrayList(map.values()); } }3. 关键优化点计数数组替代排序仅遍历字符串一次O(k)避免排序的O(k log k)开销逗号分隔生成 key防止 “计数 1 计数 1” 拼接成 “11”与 “计数 11” 混淆如aa和k的计数直接拼接会都是2加逗号后为2,0,...和0,...1,...可区分。4. 复杂度分析时间复杂度O(n×k)仅遍历字符串和计数数组无排序开销空间复杂度O(n×k)额外占用计数数组但可忽略整体仍为O(n×k)。5. 适用场景字符串长度k较大如 k≥100追求极致时间效率。五、两种方案对比总结解法时间复杂度空间复杂度代码简洁度适用场景排序法O(n×k log k)O(n×k)高字符串短、追求代码简洁计数法O(n×k)O(n×k)中字符串长、追求时间效率