我的LeetCode代码仓:https://github.com/617076674/LeetCode
原题链接:https://leetcode-cn.com/problems/group-anagrams/description/
题目描述:
知识点:哈希表
思路一:暴力解法(在LeetCode中提交会超时)
对于strs数组中的每一个字符串,都遍历一遍结果listList中的每组字符串的第一个字符串,判断其是否是字母异位词。
其时间复杂度是O(n * m * p)级别的,其中n为strs数组的长度,m为结果listList的大小,p为strs数组中每一个字符串的长度。空间复杂度是O(1)级别的。
JAVA代码:
public class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
List<List<String>> listList = new ArrayList<>();
for (int i = 0; i < strs.length; i++) {
boolean newAnagrams = true;
for (int j = 0; j < listList.size(); j++) {
if (listList.get(j).isEmpty()) {
continue;
}
if(isAnagrams(strs[i], listList.get(j).get(0))) {
newAnagrams = false;
listList.get(j).add(strs[i]);
break;
}
}
if(newAnagrams) {
List<String> list = new ArrayList<>();
list.add(strs[i]);
listList.add(list);
}
}
return listList;
}
private boolean isAnagrams(String s1, String s2) {
int[] flag = new int[26];
for (int i = 0; i < s1.length(); i++) {
flag[s1.charAt(i) - 'a'] += 1;
}
for (int i = 0; i < s2.length(); i++) {
flag[s2.charAt(i) - 'a'] -= 1;
}
for (int i = 0; i < flag.length; i++) {
if(flag[i] != 0) {
return false;
}
}
return true;
}
}
思路二:哈希表分类存储各个字符串
分类存储各个字符串的前提是先对字符串中各个字母进行排序。
我们可以先把字符串转换为字符数组,再调用Arrays函数库中的sort函数对该字符数组进行排序,最后再将该字符数组组成新的字符串,以此新字符串为哈希表的键来分类存储strs数组中的各个字符串。
排序的时间复杂度是O(plogp),其中p为strs数组中每一个字符串的长度。因此总的时间复杂度是O(n * plogp),其中n为strs数组的长度。由于使用了一个哈希表,其空间复杂度是O(m)级别的,其中m为结果listList的大小。
JAVA代码:
public class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
List<List<String>> listList = new ArrayList<>();
HashMap<String, List<String>> hashMap = new HashMap<>();
for (int i = 0; i < strs.length; i++) {
char[] array = strs[i].toCharArray();
Arrays.sort(array);
String tempString = String.valueOf(array);
if(hashMap.containsKey(tempString)) {
hashMap.get(tempString).add(strs[i]);
}else {
List<String> list = new ArrayList<>();
list.add(strs[i]);
hashMap.put(tempString, list);
}
}
for (String string : hashMap.keySet()) {
listList.add(hashMap.get(string));
}
return listList;
}
}
LeetCode解题报告: