49. 字母异位词分组

分析

方法一:排序数组分类

思路

当且仅当它们的排序字符串相等时,两个字符串是字母异位词。

算法

维护一个映射 ans : {String -> List},其中每个键 \text{K}K 是一个排序字符串,每个值是初始输入的字符串列表,排序后等于 K。

在 Java 中,我们将键存储为字符串,例如,code。 在 Python 中,我们将键存储为散列化元组,例如,('c', 'o', 'd', 'e')

class Solution {public List<List<String>> groupAnagrams(String[] strs) {if (strs.length == 0) return new ArrayList();Map<String, List> ans = new HashMap<String, List>();for (String s : strs) {char[] ca = s.toCharArray();Arrays.sort(ca);String key = String.valueOf(ca);if (!ans.containsKey(key)) ans.put(key, new ArrayList());ans.get(key).add(s);}return new ArrayList(ans.values());}
}

复杂度分析

  • 时间复杂度: O ( N K log ⁡ K ) O(NK \log K) O(NKlogK),其中 NNstrs 的长度,而 KKstrs 中字符串的最大长度。当我们遍历每个字符串时,外部循环具有的复杂度为 O(N)。然后,我们在O*(KlogK) 的时间内对每个字符串排序。
  • 空间复杂度:O(NK),排序存储在 ans 中的全部信息内容。

方法二:按计数分类

思路

当且仅当它们的字符计数(每个字符的出现次数)相同时,两个字符串是字母异位词。

算法

我们可以将每个字符串s 转换为字符数 count,由26个非负整数组成,表示 a,b,c 的数量等。我们使用这些计数作为哈希映射的基础。

在 Java 中,我们的字符数 count 的散列化表示将是一个用 **#** 字符分隔的字符串。 例如,abbccc 将表示为 #1#2#3#0#0#0 ...#0,其中总共有26个条目。 在 python 中,表示将是一个计数的元组。 例如,abbccc 将表示为 (1,2,3,0,0,...,0),其中总共有 26 个条目。

class Solution {public List<List<String>> groupAnagrams(String[] strs) {if (strs.length == 0) return new ArrayList();Map<String, List> ans = new HashMap<String, List>();int[] count = new int[26];for (String s : strs) {Arrays.fill(count, 0);for (char c : s.toCharArray()) count[c - 'a']++;StringBuilder sb = new StringBuilder("");for (int i = 0; i < 26; i++) {sb.append('#');sb.append(count[i]);}String key = sb.toString();if (!ans.containsKey(key)) ans.put(key, new ArrayList());ans.get(key).add(s);}return new ArrayList(ans.values());}
}

复杂度分析

  • 时间复杂度:O(NK),其中 N 是 strs 的长度,而 KKstrs 中字符串的最大长度。计算每个字符串的字符串大小是线性的,我们统计每个字符串。
  • 空间复杂度:O(NK),排序存储在 ans 中的全部信息内容。

方法三:用质数帮助分类

算术基本定理,又称为正整数的唯一分解定理,即:每个大于1的自然数,要么本身就是质数,要么可以写为2个以上的质数的积,而且这些质因子按大小排列之后,写法仅有一种方式。

利用这个,我们把每个字符串都映射到一个正数上。

用一个数组存储质数 prime = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103}。

然后每个字符串的字符减去 ’ a ’ ,然后取到 prime 中对应的质数。把它们累乘。

例如 abc ,就对应 ‘a’ - ‘a’, ‘b’ - ‘a’, ‘c’ - ‘a’,即 0, 1, 2,也就是对应素数 2 3 5,然后相乘 2 * 3 * 5 = 30,就把 “abc” 映射到了 30。

  • Java
class Solution {public List<List<String>> groupAnagrams(String[] strs) {if(strs.length==0) return new ArrayList();HashMap<Integer,List> ans = new HashMap<>();int[] prime = { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103 };for(int i=0;i<strs.length;i++){int key=1;for(int j=0;j<strs[i].length();j++){key *= prime[strs[i].charAt(j)-'a'];}if (!ans.containsKey(key)) ans.put(key, new ArrayList());ans.get(key).add(strs[i]);}return new ArrayList(ans.values());}
}

时间复杂度:O(n * K),K 是字符串的最长长度。

空间复杂度:O(NK),用来存储结果。

这个解法时间复杂度,较方法一有提升,但是有一定的局限性,因为求 key 的时候用的是累乘,可能会造成溢出,超出 int 所能表示的数字。

【LeetCode】49.字母异位词分组 (三种解法开拓思路,java实现)相关推荐

  1. leetcode 49. 字母异位词分组

    49. 字母异位词分组 - 力扣(LeetCode) 一开始想的是把各个字符串中每个字符ascii码值相加,然后相同的ascii码值放在一个组,在相同的ascii码值组中再去细找字母异位词. 一开始算 ...

  2. LeetCode 49字母异位词分组50pow(x,n)51八皇后

    原创公众号:bigsai 如果不错记得点赞收藏! 关注回复 bigsai 领取Java进阶pdf资源,回复进群加入力扣打卡群. 上周打卡内容:43字符串相乘&44通配符匹配 45跳跃游戏&am ...

  3. LeetCode 49. 字母异位词分组(哈希)

    1. 题目 给定一个字符串数组,将字母异位词组合在一起.字母异位词指字母相同,但排列不同的字符串. 示例:输入: ["eat", "tea", "ta ...

  4. leetcode 49. 字母异位词分组(排序+hash)

    给定一个字符串数组,将字母异位词组合在一起.字母异位词指字母相同,但排列不同的字符串. 示例: 输入: ["eat", "tea", "tan&quo ...

  5. LeetCode 49. 字母异位词分组 Group Anagrams

    给定一个字符串数组,将字母异位词组合在一起.字母异位词指字母相同,但排列不同的字符串. 示例: 输入: ["eat", "tea", "tan&quo ...

  6. LeetCode 49 字母异位词分组

    力扣 思路:哈希表: 排序:对两个字符串分别进行排序之后得到的字符串是相同的 将排序之后的字符串作为哈希表的键     (参考LeetCode官方题解)  定义哈希表 unordered_map< ...

  7. 字母异位词分组 两种解法 (Python)

    LeetCode链接 排序作为dict的键 时间复杂度 O(n * klogk) class Solution:def groupAnagrams(self, strs: List[str]) -&g ...

  8. 【LeetCode】【HOT】49. 字母异位词分组(递归)

    [LeetCode][HOT]49. 字母异位词分组 文章目录 [LeetCode][HOT]49. 字母异位词分组 package hot;import java.util.ArrayList; i ...

  9. Leetcode刷题100天—49. 字母异位词分组( 排序)—day37

    前言: 作者:神的孩子在歌唱 大家好,我叫运智 49. 字母异位词分组 难度中等847收藏分享切换为英文接收动态反馈 给你一个字符串数组,请你将 字母异位词 组合在一起.可以按任意顺序返回结果列表. ...

最新文章

  1. python中内建函数_python常用内建函数
  2. 漫画 | 在中国,程序媛到底有多难?
  3. 绝不能错过的10款最新OpenStack网络运维 监控工具
  4. 就是这么迅猛的实现搜索需求--转
  5. bin/...的访问被拒绝被拒绝的问题
  6. python3函数调用时间_Python3 time clock()方法
  7. 深圳dotnet俱乐部新群
  8. Flsak爱家租房--订单(获取用户订单、用户评论)
  9. python实例 77,78
  10. 【视频教程】JEECG 入门视频教程
  11. The use specified as definer('root'@'%') does not exist的解决办法
  12. IDEA Properties 文件乱码
  13. Java必知必会:异常机制详解
  14. textfield tips
  15. 模拟SAP ALV下载XLSX文件
  16. RGB图像能处理成灰色的红外图像吗?
  17. LTP性能测试工具的使用详解
  18. 系统学习深度学习(十)--优化算法
  19. 淘宝关注的主播查询教程(2021)
  20. 我学炒外汇 第二十一篇波浪理论

热门文章

  1. 输出246810图形c语言,二级C语言模拟试题8套
  2. 电信网通全国DNS 列表
  3. WorldFirst手续费是多少?WorldFirst收取的费用有哪些?
  4. rkmedia 调试笔记
  5. 密码管理软件:Keepass2Android-1.09a-r3
  6. 编程小白一个月开发一套WEB进销存系统
  7. 丹尼尔•卡尼曼《思考,快与慢》
  8. Fortran77-90-95
  9. matlab实验报告李琼指数函数,基于MATLAB的多元非线性回归模型
  10. CPU世上最全说明解析