菜鸡每日一题系列打卡49天
每天一道算法题目
小伙伴们一起留言打卡
坚持就是胜利,我们一起努力!
题目描述(引自LeetCode)
给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。
示例:
输入: ["eat", "tea", "tan", "ate", "nat", "bat"]
输出:
[
["ate","eat","tea"],
["nat","tan"],
["bat"]
]
说明:
所有输入均为小写字母。
不考虑答案输出的顺序。
题目分析
这是一道字符串的相关题目,题目给出了字母异位词的定义,比较容易想到的思路是,对字符串的字符按照某一顺序(比如字典序)进行排序,然后比较是否相等。但排序的时间复杂度为O(nlogn),而题目又限定输入仅为小写字母,因此,可以考虑采用哈希映射来进行比较。
本文将按照后一种思路进行实现,值得注意的是,在单线程情况下进行大量字符串拼接操作时,使用StringBuilder类效率会更高。话不多说,上代码!
代码实现
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
if (strs == null || strs.length == 0) return new ArrayList<>();
Map<String, List<String>> map = new HashMap<>();
for (String str : strs) {
int[] tmp = new int[26];
for (char c : str.toCharArray()) tmp[c - 'a']++;
StringBuilder builder = new StringBuilder();
for (int i = 0; i < 26; i++) builder.append(tmp[i]);
String key = builder.toString();
if (!map.containsKey(key)) map.put(key, new ArrayList<>());
map.get(key).add(str);
}
return new ArrayList(map.values());
}
}
代码分析
对代码进行分析,不妨设strs[]数组的长度为m,设strs[]数组中长度最大的str字符串长度为n,则时间复杂度为O(mn),而就空间而言,需要用额外的哈希表进行存储,因此,空间复杂度也为O(mn)。
执行结果
学习 | 工作 | 分享
????长按关注“有理想的菜鸡”
只有你想不到,没有你学不到