题目描述
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的所有字母得到的一个新单词。
示例 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] 仅包含小写字母
题目解析
字母异位词的字母成分一定是相同的,目标是把相同字母成分的字符串放到一个分组里。
属于根据特征进行归类的模式,应该利用散列表。因此分两步,
初始化一个哈希表,key为字母成分(通过排序后的字母串作为唯一标识),值为该成分下的所有字母异位词字符串;
遍历元素字符串,如果该字母成分未出现在哈希表中,加入哈希表,字母成分串对应的组合也增加该元素;如果已出现在哈希表,获取组合列表,追加该元素
参考代码
以下为 Java 代码。
/**
字母异位词的字母成分一定是相同的,目标是把相同字母成分的字符串放到一个分组里。
属于根据特征进行归类的模式,应该利用散列表。
因此分两步,
1、初始化一个哈希表,key为字母成分(通过排序后的字母串作为唯一标识),值为该成分下的所有字母异位词字符串;
2、遍历元素字符串,如果该字母成分未出现在哈希表中,加入哈希表,字母成分串对应的组合也增加该元素;如果已出现在哈希表,获取组合列表,追加该元素
*/
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
//初始化key为字母成分唯一标识,值为字母异位词字符串列表的哈希表
Map<String,List<String>> letter2TarList = new HashMap<String,List<String>>();
for(String str:strs){
//通过排序方式构建字母成分唯一标识
char[] letterArr=str.toCharArray();
Arrays.sort(letterArr);
String letterKey = new String(letterArr);
//获取字母成分唯一标识下的字母异位词列表
List<String> tempGroup = letter2TarList.getOrDefault(letterKey,new ArrayList<String>());
//追加当前字符串
tempGroup.add(str);
//更新哈希表
letter2TarList.put(letterKey,tempGroup);
}
return new ArrayList<List<String>>(letter2TarList.values());
}
}
复杂度分析
时间复杂度:O(nklogk)。
其中 n 是入参数组 strs 中的字符串的数量,k 是字符串的最大长度。
需要遍历 n 个字符串,对于每个字符串,需要 O(klogk)的时间进行排序以及 O(1) 的时间更新哈希表,因此总时间复杂度是 O(nklogk)。
空间复杂度:O(nk)。
其中 n 是入参数组 strs 中的字符串的数量,k 是字符串的的最大长度。需要用哈希表存储全部字符串。
我是蜗牛,大厂程序员,专注技术原创和个人成长,正在互联网上摸爬滚打。欢迎关注我,和蜗牛一起成长,我们一起牛~下期见!
推荐阅读:
1120页的Leetcode算法刷题笔记,完整版PDF开放下载!
点阅读原文发现更多Java资源宝藏~
点分享
点收藏
点点赞
点在看