LeetCode49 字母异位词分组
时间:2021-07-21
本文章向大家介绍LeetCode49 字母异位词分组,主要包括LeetCode49 字母异位词分组使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题目
给定一个字符串数组,将字母异位词组合在一起。可以按任意顺序返回结果列表。
字母异位词指字母相同,但排列不同的字符串。
示例 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] 仅包含小写字母
方法
本题解题思路都是用hashmap为存储,必须用String为key保存
排序法
首先将每个字符串排序,查询排序后的字符串是否存在map中
- 时间复杂度:O(nklogk),n为字符串个数,k为字符串的长度,排序需要nlogn
- 空间复杂度:O(nk)
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
Map<String,List<String>> map = new HashMap<>();
for(String str:strs){
char[] c = str.toCharArray();
Arrays.sort(c);
String key = String.valueOf(c);
if(map.containsKey(key)){
map.get(key).add(str);
}else{
List<String> value = new ArrayList<>();
value.add(str);
map.put(key,value);
}
}
List<List<String>> result = new ArrayList<>();
for(List<String> value:map.values()){
result.add(value);
}
return result;
}
}
计数法
首先把每个字符串的所有字符存入对应数组下标,然后再拼成字符串
- 时间复杂度:O(n*k),n为字符串的个数,m为最长字符串的长度
- 空间复杂度:O(n(k+∣Σ∣)),其中 nn 是字符串的数量,k是字符串的最大长度,Σ是字符集即26
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/group-anagrams/solution/zi-mu-yi-wei-ci-fen-zu-by-leetcode-solut-gyoc/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
Map<String,List<String>> map = new HashMap<>();
for(String str:strs){
int[] ch = new int[26];
for(int i=0;i<str.length();i++){
ch[str.charAt(i)-'a'] ++;
}
StringBuffer strBuf = new StringBuffer();
for(int i=0;i<26;i++){
if(ch[i]!=0){
strBuf.append('a'+i);
strBuf.append(ch[i]);
}
}
String key = strBuf.toString();
List<String> value = map.getOrDefault(key,new ArrayList<>());
value.add(str);
map.put(key,value);
}
return new ArrayList<List<String>>(map.values());
}
}
原文地址:https://www.cnblogs.com/ermiao-zy/p/15038609.html
- 原生JS | 值类型与引用类型变量
- 【编程基础】C语言内存使用的常见问题
- kmeans聚类理论篇K的选择(轮廓系数)
- 算法之旅 | 选择排序法
- 【专业技术】Android数据保存之SharedPreferences
- 【答疑解惑】Java中的高精度数字
- 2000! | 看上去如此简单的面试题,让太多“前端”英雄好汉折戟
- 【Windows编程】系列第六篇:创建Toolbar与Statusbar
- arguments,想说爱你不容易
- 【android开发】Android binder学习一:主要概念
- 高考啦! JavaScript高考全国卷
- 2017 JavaScript高考全国卷 参考答案与解析
- 用贝叶斯判别分析方法预测股票涨跌
- 开发 | 在 Mac OS X 装不上 TensorFlow?看了这篇就会装
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法