当前位置: 首页 > news >正文

算法刷题记录——LeetCode篇(1.5) [第41~50题](持续更新)

更新时间:2025-03-29

  • LeetCode题解专栏:实战算法解题 (专栏)
  • 技术博客总目录:计算机技术系列目录页

优先整理热门100及面试150,不定期持续更新,欢迎关注!


49. 字母异位词分组

给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。

字母异位词 是由重新排列源单词的所有字母得到的一个新单词。

示例 1:

输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]

示例 2:

输入: strs = [""]
输出: [[""]]

示例 3:

输入: strs = ["a"]
输出: [["a"]]

提示:

  • 1 <= strs.length <= 104
  • 0 <= strs[i].length <= 100
  • strs[i] 仅包含小写字母

方法一:排序哈希法

将每个字符串排序后的结果作为哈希表的键。字母异位词排序后的字符串相同,因此可以通过哈希表分组。

  1. 遍历每个字符串,将其转换为字符数组并排序。
  2. 将排序后的字符串作为键,原字符串添加到对应的列表中。
  3. 返回所有哈希表的值作为结果。

代码:

class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
        Map<String, List<String>> map = new HashMap<>();
        for (String s : strs) {
            char[] chars = s.toCharArray();
            Arrays.sort(chars);
            String key = new String(chars);
            map.putIfAbsent(key, new ArrayList<>());
            map.get(key).add(s);
        }
        return new ArrayList<>(map.values());
    }
}

复杂度分析:

  • 时间复杂度O(nk log k),其中 n 是字符串个数,k 是字符串最大长度。排序每个字符串需要 O(k log k) 时间。
  • 空间复杂度O(nk),哈希表存储所有字符串的键和列表。

方法二:计数哈希法

统计每个字符串中各字母的出现次数,将计数结果转换为唯一字符串作为哈希表的键。例如,“aab” 转换为 #2#1#0...#0

  1. 遍历每个字符串,统计每个字母的出现次数。
  2. 将计数数组转换为固定格式的字符串作为键。
  3. 将原字符串添加到对应的列表中,最终返回结果。

代码:

class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
        Map<String, List<String>> map = new HashMap<>();
        for (String s : strs) {
            int[] count = new int[26];
            for (char c : s.toCharArray()) {
                count[c - 'a']++;
            }
            StringBuilder keyBuilder = new StringBuilder();
            for (int i = 0; i < 26; i++) {
                keyBuilder.append('#');
                keyBuilder.append(count[i]);
            }
            String key = keyBuilder.toString();
            map.putIfAbsent(key, new ArrayList<>());
            map.get(key).add(s);
        }
        return new ArrayList<>(map.values());
    }
}

复杂度分析:

  • 时间复杂度O(nk),统计和构建键的时间为 O(k + 26)
  • 空间复杂度O(nk),存储所有字符串的键和列表。

对比总结

  • 排序法 实现简单,适合字符串较短的情况。
  • 计数法 在字符串较长时更高效,避免了排序的时间开销。

声明

  1. 本文版权归 CSDN 用户 Allen Wurlitzer 所有,遵循CC-BY-SA协议发布,转载请注明出处。
  2. 本文题目来源 力扣-LeetCode ,著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

相关文章:

  • Neo4j【环境部署 03】插件APOC和ALGO配置使用实例分享(网盘分享3.5.5兼容版本插件)
  • 【Windows】win10系统安装.NET Framework 3.5(包括.NET 2.0和3.0)失败 错误代码:0×80240438
  • 【最新】探索CFD的未来:从OpenFOAM到深度学习,全面解析计算流体力学的顶级资源与前沿技术
  • c++并发编程阅读笔记
  • Oracle logminer详解
  • 鸿蒙NEXT开发日志工具类(ArkTs)
  • 全新UI好看404页面源码
  • Unity的UI适配
  • Qt常用宏定义判断大全
  • 从纸质到 AI 时代:我的笔记工具探索之旅
  • Z-Wave与Matter的协同应用:构建无缝互联的智能家居
  • 2025年华为HCIP题库分享
  • PyTorch + torchvision是什么
  • 《深度学习》——bert框架
  • Axure项目实战:智慧运输平台后台管理端-承运商管理(中继器筛选)
  • 设计模式扩展 MyBatis Plus BaseMapper接口
  • java学习笔记10——集合框架
  • 蚂蚁集团主导的ISO密码学国际标准立项,纳入国产算法
  • AI赋能股票:流通股本与总股本:定义、区别及投资意义解析
  • 【STM32单片机】#4 OLED调试外部中断
  • 多网合一网站平台建设/小白如何学电商运营
  • 网站访问不了的原因/社群营销的方法和技巧
  • 免费做产品画册的网站/上海抖音seo公司
  • 做鸡鸭冻品生意的都在使用的网站/建站工具
  • 狼雨的网站/b站推广网站2022
  • 国外独立站建站/windows优化大师是什么