刷
July-17-2019
第一反应是每个String都sort一下,然后分类,事实上也是正确的。。
Time: O(n KlgK)
Space: O(nk)
k = length of word
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
Map<String, List<String>> m = new HashMap<>();
for (String s : strs) {
char[] chars = s.toCharArray();
Arrays.sort(chars);
String tempKey = new String(chars);
if (!m.containsKey(tempKey)) {
m.put(tempKey, new ArrayList<>());
}
m.get(tempKey).add(s);
}
return new ArrayList<>(m.values());
}
}
上面其实没用Anagram的另一个特性,char出现的次数相等就行,所以sort的KlgK其实浪费了,我们只要算出每个字母出现的次数然后作为Map里的key就行。
时间上:KlgK => 26K
Time: O(nK*26)
public List<List<String>> groupAnagrams(String[] strs) {
Map<String, List<String>> map = new HashMap<>();
int[] charCount = new int[26];
StringBuilder keyBuilder = new StringBuilder();
for (String s : strs) {
Arrays.fill(charCount, 0);
for (char c : s.toCharArray()) {
charCount[c - 'a'] ++;
}
keyBuilder = new StringBuilder();
for (int i = 0; i < 26; i ++) {
keyBuilder.append(charCount[i]).append((char)(i + 'a'));
}
String tempKey = keyBuilder.toString();
if (!map.containsKey(tempKey)) map.put(tempKey, new ArrayList<>());
map.get(tempKey).add(s);
}
return new ArrayList<>(map.values());
}
三刷。
印象很深,秒之。。
利用anagram的单词sort之后的结果是一样的。
建立一个< String, List< String >>的map,每个string都先sort一下,然后所有sort之后和这个一样的放到一个list里。。
最后按list添加就行了。。
Time Complexity: O(k nlgn) K个单词,每个排序nlgn
Space Complexity: O(nk) 所有单词存到MAP里。
public class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
List<List<String>> res = new ArrayList<>();
Map<String, List<String>> map = new HashMap<>();
for (int i = 0; i < strs.length; i++) {
char[] ch = strs[i].toCharArray();
Arrays.sort(ch);
String tempStr = new String(ch);
if (map.containsKey(tempStr)) {
map.get(tempStr).add(strs[i]);
} else {
List<String> l = new ArrayList<>();
l.add(strs[i]);
map.put(tempStr, l);
}
}
for (String s: map.keySet()) {
res.add(map.get(s));
}
return res;
}
}