当前位置:网站首页>【LeetCode-49】字母异位词分组
【LeetCode-49】字母异位词分组
2022-08-11 05:30:00 【Ring*】
6.12 字母异位词分组【49】
6.12.1 题目描述
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母通常恰好只用一次。
前言
两个字符串互为字母异位词,当且仅当两个字符串包含的字母相同。同一组字母异位词中的字符串具备相同点,可以使用相同点作为一组字母异位词的标志,使用哈希表存储每一组字母异位词,哈希表的键为一组字母异位词的标志,哈希表的值为一组字母异位词列表。
遍历每个字符串,对于每个字符串,得到该字符串所在的一组字母异位词的标志,将当前字符串加入该组字母异位词的列表中。遍历全部字符串之后,哈希表中的每个键值对即为一组字母异位词。
以下的两种方法分别使用排序和计数作为哈希表的键。
6.12.2 方法一:
由于互为字母异位词的两个字符串包含的字母相同,因此对两个字符串分别进行排序之后得到的字符串一定是相同的,故可以将排序之后的字符串作为哈希表的键。
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
Map<String, List<String>> map = new HashMap<String, List<String>>();
for (String str : strs) {
char[] array = str.toCharArray();
Arrays.sort(array);
String key = new String(array); // 得到排序后的key作为hashmap的键值
// 如果map中有key对应的值,则取出来,没有就创建一个新的list
List<String> list = map.getOrDefault(key, new ArrayList<String>());
list.add(str);
map.put(key, list); // list添加新的之后再加入map中覆盖
}
return new ArrayList<List<String>>(map.values()); // 取map中所有的list输出
}
}
复杂度分析
- 时间复杂度: O ( n k log k ) O(nk \log k) O(nklogk),其中 n 是 strs 中的字符串的数量,k 是 strs 中的字符串的的最大长度。需要遍历 n 个字符串,对于每个字符串,需要 O(klogk) 的时间进行排序以及 O(1) 的时间更新哈希表,因此总时间复杂度是 O(nklogk)。
- 空间复杂度:O(nk),其中 n 是 strs 中的字符串的数量,k 是 strs 中的字符串的的最大长度。需要用哈希表存储全部字符串。
6.12.3 方法二:计数
由于互为字母异位词的两个字符串包含的字母相同,因此两个字符串中的相同字母出现的次数一定是相同的,故可以将每个字母出现的次数使用字符串表示,作为哈希表的键。
由于字符串只包含小写字母,因此对于每个字符串,可以使用长度为 26 的数组记录每个字母出现的次数。需要注意的是,在使用数组作为哈希表的键时,不同语言的支持程度不同,因此不同语言的实现方式也不同。
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
Map<String, List<String>> map = new HashMap<String, List<String>>();
for (String str : strs) {
int[] counts = new int[26];
int length = str.length();
for (int i = 0; i < length; i++) {
counts[str.charAt(i) - 'a']++;
}
// 将每个出现次数大于 0 的字母和出现次数按顺序拼接成字符串,作为哈希表的键
StringBuffer sb = new StringBuffer();
for (int i = 0; i < 26; i++) {
if (counts[i] != 0) {
sb.append((char) ('a' + i));
sb.append(counts[i]);
}
}
String key = sb.toString();
List<String> list = map.getOrDefault(key, new ArrayList<String>());
list.add(str);
map.put(key, list);
}
return new ArrayList<List<String>>(map.values());
}
}
复杂度分析
6.12.4 my answer—排序
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
int n = strs.length;
if(n==0)return null;
List<String> list1 = new ArrayList<>(); // 排序后的单词表
for (int i = 0; i < strs.length; i++) {
char[] tempC = strs[i].toCharArray(); // 转为数组
Arrays.sort(tempC); // 进行排序
String tempS = String.valueOf(tempC); // 再转为字符串
list1.add(tempS);
}
Set<String> set = new HashSet<>(); // 得到ans有多少中答案
for (String s : list1) {
set.add(s);
}
List<List<String>> ans = new ArrayList<>();
Set<Integer> setInt = new HashSet<>(); // 用于扫描list1时,去除已经扫描过的单词
for (int i = 0; i < set.size(); i++){
List<String> ans1 = new ArrayList<>();
Set<String> setString = new HashSet<>();
for (int j = 0; j < list1.size(); j++) {
if(setInt.contains(j))continue;
if (setString.size()==0){
setString.add(list1.get(j));
setInt.add(j);
ans1.add(strs[j]);
}else {
if (setString.contains(list1.get(j))){
setInt.add(j);
ans1.add(strs[j]);
}
}
}
setString.clear();
ans.add(ans1);
}
return ans;
}
}
边栏推荐
- C语言-6月10日-my_strcat函数的编写
- 自己动手写RISC-V的C编译器-01实现加减法
- C语言-7月22日- NULL和nullptr的深入了解以及VScode对nullptr语句报错问题的解决
- js learning advanced (event senior pink teacher teaching notes)
- Interpretation of the paper: GAN and detection network multi-task/SOD-MTGAN: Small Object Detection via Multi-Task Generative Adversarial Network
- 【无标题】
- JS进阶网页特效(pink老师笔记)
- OpenMLDB: Consistent production-level feature computing platform online and offline
- js learning advanced BOM part (pink teacher notes)
- 星盟-pwn-babyfmt
猜你喜欢

The Summer of Open Source 2022 is coming | Welcome to sign up for the OpenMLDB community project~

Tinker接入全流程---配置篇

Building a data ecology for feature engineering - Embrace the open source ecology, OpenMLDB fully opens up the MLOps ecological tool chain

The whole process of Tinker access --- Compilation

连接数据库时出现WARN: Establishing SSL connection without server‘s identity verification is not recommended.

nepctf Nyan Cat 彩虹猫

The third phase of the contributor task is wonderful

Jetpack's dataBinding

C语言-7月31日-指针的总结以及typedef关键字

JS小技巧,让你编码效率杠杠的,快乐摸鱼
随机推荐
heap2 (tcache attack,house of orange)
活动预告 | 4月23日,多场OpenMLDB精彩分享来袭,不负周末好时光
父子节点数据格式不一致的树状列表实现
Event Preview | On April 23, a number of wonderful sharing sessions of OpenMLDB will come, which will live up to the good time of the weekend
Fourth Paradigm OpenMLDB optimization innovation paper was accepted by VLDB, the top international database association
黑马大事件项目
OpenMLDB Pulsar Connector:高效打通实时数据到特征工程
js 学习进阶(事件高级 pink老师教学笔记)
第一章 Verilog语言和Vivado初步使用
微信小程序_开发工具的安装
Tinker接入全流程---配置篇
C语言-7月18日-二维数组的学习
JVM tuning and finishing
Day 78
Visual studio2019 配置使用pthread
星盟-pwn-babyheap
Node stepping on the pit 80 port is occupied
【LeetCode-205】同构字符串
经纬度求距离
c语言-数据存储部分