CS-Wiki CS-Wiki
Home
知识体系总览
  • 数据结构与算法
  • 计算机网络
  • 操作系统
  • MySQL
  • Redis
  • 设计模式
  • Java 基础
  • Java 集合
  • Java 并发
  • Java 虚拟机
  • Spring
  • Kafka
  • 校招扫盲
  • 项目推荐
  • 唠唠嗑儿
  • 读书笔记
归档
GitHub (opens new window)
Home
知识体系总览
  • 数据结构与算法
  • 计算机网络
  • 操作系统
  • MySQL
  • Redis
  • 设计模式
  • Java 基础
  • Java 集合
  • Java 并发
  • Java 虚拟机
  • Spring
  • Kafka
  • 校招扫盲
  • 项目推荐
  • 唠唠嗑儿
  • 读书笔记
归档
GitHub (opens new window)
  • 刷题模板汇总
  • 一些刷题小技巧
  • 整数 and 位运算

  • 数组

  • 链表

  • 哈希表

    • 哈希表理论基础
    • 剑指 Offer 50 - 第一个只出现一次的字符
    • 验证外星语词典
    • 有效的字母异位词
    • 字母异位词分组
      • 📃 题目描述
      • 🔔 解题思路
      • 💥 复杂度分析
    • 单词长度的最大乘积
    • 两个数组的交集
    • 多个数组求交集
    • 赎金信
    • 快乐数
    • 两数之和
    • 四数相加 II
    • 最小时间差
    • 缺失的第一个正数
    • 最长连续序列
    • 剑指 Offer 03 - 数组中重复的数字
    • 利用哈希表设计高级结构

  • 字符串

  • 栈

  • 队列

  • 二叉树

  • 前缀树

  • 二分查找

  • 双指针法

  • 区间求和问题

  • 排序

  • 回溯算法

  • 贪心算法

  • 动态规划

  • 图

  • 数学

  • 自动机

  • 海量数据和空间限制

  • 05-数据结构与算法
  • 哈希表
小牛肉
2022-04-13
目录

字母异位词分组

# 📃 题目描述

题目链接:

  • 剑指 Offer II 033. 变位词组 - 力扣(LeetCode) (leetcode-cn.com) (opens new window)
  • 49. 字母异位词分组 - 力扣(LeetCode) (leetcode-cn.com) (opens new window)

# 🔔 解题思路

上道题 剑指 Offer II 032. 有效的变位词 - 力扣(LeetCode) (leetcode-cn.com) (opens new window) 把相同的两个字符串不视为异位词,而本道题是把相同的两个字符串视为异位词的,小细节,注意下就行

思路:把一组变位词映射到同一个单词。

由于互为变位词的单词的字母出现的次数分别相同,因此如果把单词中的字母排序就会得到相同的字符串。例如,把"eat"、"tea"和"ate"的字母按照字母表顺序排序都得到字符串"aet"。

因此,可以定义一个哈希表,哈希表的 key 是把单词字母排序得到的字符串,而 value 为对应的一些变位词(通过排序后能够和 key 相同的字符串):

class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
        // key: 排序好的字符串,value: 通过排序后能够和 key 相同的字符串
        Map<String, List<String>> map = new HashMap<>();

        for (String str : strs) {
            char[] charArray = str.toCharArray();
            // 按照字母顺序排序
            Arrays.sort(charArray);
            String sorted = new String(charArray);
            map.putIfAbsent(sorted, new ArrayList<>());

            map.get(sorted).add(str);
        }

        List<List<String>> res = new ArrayList<>();
        for (String key : map.keySet()) {
            res.add(map.get(key));
        }

        return res;
    }
}

# 💥 复杂度分析

  • 空间复杂度:O(N)
  • 时间复杂度:主要就是循环和排序的时间:如果每个单词平均有 m 个字母,排序一个单词需要 O(mlogm) 的时间。假设总共有n个单词,该算法总的时间复杂度是O(nmlogm)

🎁 公众号

各位小伙伴大家好呀,叫我小牛肉就行,目前在读东南大学硕士,上方扫码关注公众号「飞天小牛肉」,与你分享我的成长历程与技术感悟~

帮助小牛肉改善此页面 (opens new window)
Last Updated: 2023/02/16, 11:27:10
有效的字母异位词
单词长度的最大乘积

← 有效的字母异位词 单词长度的最大乘积→

最近更新
01
关于编程满天星
02
让我来告诉你 Java 程序员是怎么一步一步从入行到被裁的
06-08
03
Vision Pro,未来已来
06-06
更多文章>
Theme by Vdoing | Copyright © 2019-2023 飞天小牛肉 | 皖ICP备2022008966号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式