给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。

示例:

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

说明:

  • 所有输入均为小写字母。
  • 不考虑答案输出的顺序。

方法一:排序数组分类

思路

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

算法

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

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

复杂度分析

  • 时间复杂度:O(NKlogK)O(NK \log K)O(NKlogK),其中 NNN 是 strs 的长度,而 KKK 是 strs 中字符串的最大长度。当我们遍历每个字符串时,外部循环具有的复杂度为 O(N)O(N)O(N)。然后,我们在 O(KlogK)O(K \log K)O(KlogK) 的时间内对每个字符串排序。

  • 空间复杂度:O(NK)O(NK)O(NK),排序存储在 ans 中的全部信息内容。


方法二:按计数分类

思路

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

算法

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

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

复杂度分析

  • 时间复杂度:O(NK)O(NK)O(NK),其中 NNN 是 strs 的长度,而 KKK 是 strs 中字符串的最大长度。计算每个字符串的字符串大小是线性的,我们统计每个字符串。

  • 空间复杂度:O(NK)O(NK)O(NK),排序存储在 ans 中的全部信息内容。

public class Solution {public List<List<String>> groupAnagrams(String[] strs) {HashMap<String , List<String>> map = new HashMap<> ();for(String s : strs) {char[] chars = s.toCharArray();Arrays.sort(chars);String tmp = new String(chars);if(map.containsKey(tmp)) {map.get(tmp).add(s);} else {ArrayList<String> list = new ArrayList<>();list.add(s);map.put(tmp, list);}}List<List<String>> groups =   new ArrayList<> ( map.values());for(int i = 0 ; i < groups.size(); i++) {List<String> group = groups.get(i);String[] ss =  group.toArray(new String[group.size()]);Arrays.sort(ss);groups.set(i, Arrays.asList(ss));}return groups;}
}

LeetCode 49. 字母异位词分组 Group Anagrams相关推荐

  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 字母异位词分组

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

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

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

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

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

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

    49. 字母异位词分组 分析 方法一:排序数组分类 思路 当且仅当它们的排序字符串相等时,两个字符串是字母异位词. 算法 维护一个映射 ans : {String -> List},其中每个键 ...

  9. 49. 字母异位词分组

    49. 字母异位词分组 给你一个字符串数组,请你将 字母异位词 组合在一起.可以按任意顺序返回结果列表. 字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母都恰好只用一次. 示例 ...

最新文章

  1. GIS 相关知识扫盲
  2. iOS宏定义的使用与规范
  3. java8中的函数式数据处理
  4. Python中list、set和tuple
  5. 湖南大学计算机考研考什么,2017年湖南大学计算机系统考研大纲
  6. ubuntu server 安装
  7. SAP UI5 workthrough 12 sap.m.shell
  8. js随机从数组中取出几个元素
  9. swift. 扩展类添加属性_Swift快速为类扩展属性
  10. 当我以为这是最后一个Bug,改完就能提交了的时候
  11. Android Studio Cmake C++ JNI demo
  12. [约瑟夫环]n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始... ...
  13. 交换机设备登录账号权限1_Stelnet(ssh)登陆华为交换机配置教程
  14. 从0开始,设计研发一个全功能通用大数据系统
  15. 希捷为 Xbox 更新 Game Drive SSD 具有新外观和内部结构
  16. 计算机时间怎么改24小时模式,怎么修改电脑的时间为24小时制啊?
  17. 开发行业职业病之~~“键盘手”“鼠标手”“腱鞘炎”
  18. vue-shop 表格中使用树形控件 vue-table-width-tree-grid
  19. Mysql 性能优化教程
  20. Win10的截图功能

热门文章

  1. c++ primer 5th 笔记
  2. 百度搜索高级语法技巧大全
  3. 程序员的自我进化:补上最短的那块情商木板
  4. JAVA基础复习笔记——day2
  5. 使用OpenCV中的色彩空间进行颜色分割
  6. 天之骄子还是平凡之路
  7. 【接前篇】进阶的KMP
  8. SpringBoot 控制器方法自定义参数注入
  9. CF1007E Mini Metro(DP 化散为整,将状态压缩)
  10. 创建LVM逻辑卷并挂载