version at: 2022-03-29
/**
1. 题意是为所有字符串分类. 分类的标准是使用的字母是一样的, 但不关心顺序
2. 把每个字符串都转化为字典序最小的, 然后放到对应容器即可
3. 学习了下java-stream 怎么写int[] to String
*/
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
Map<String, List<String>> map = new HashMap<>();
for (int i = 0 ; i < strs.length ; i++) {
String flag = getFlag(strs[i]);
if (!map.containsKey(flag)) map.put(flag, new ArrayList<>());
map.get(flag).add(strs[i]);
}
return map.values().stream().collect(Collectors.toList());
}
String getFlag(String s) {
return s.chars().sorted().mapToObj(c->(char)c).map(String::valueOf).collect(Collectors.joining(""));
}
}
version at: 2020-02-10
// 1. 本质来讲要把string 内部顺序确定
// 2. 做法区别是用直接sort-> O(klogk)还是 计数排序-> O (k + C=26)
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
List<List<String>> result = new ArrayList<>();
Map<Integer, List<String>> mapping = new LinkedHashMap<>();
for (int i = 0 ; i < strs.length; i ++){
String s = strs[i];
int hash = hashCode(s);
if (! mapping.containsKey(hash)){
mapping.put(hash, new ArrayList<>());
}
mapping.get(hash).add(s);
}
for (Integer h : mapping.keySet()){
result.add(mapping.get(h));
}
return result;
}
public int hashCode(String s){
char[] array = s.toCharArray();
Arrays.sort(array);
return new String(array).hashCode();
}
}