1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Solution {
public List<List<String>> groupStrings(String[] strings) {
Map<String, List<String>> map = new HashMap<>();
for (String string : strings) {
String hash = getHash(string);
map.computeIfAbsent(hash, a -> new ArrayList<>()).add(string);
}
List<List<String>> ans = new ArrayList<>(map.values());
return ans;
}

private String getHash(String s) {
StringBuilder ans = new StringBuilder();
char[] charArray = s.toCharArray();
for (int i = 1; i < charArray.length; i++) {
if (charArray[i] < charArray[i - 1]) {
ans.append(charArray[i] - charArray[i - 1] + 26).append('*');
} else {
ans.append(charArray[i] - charArray[i - 1]).append('*');
}
}
return ans.toString();
}
}

computeIfAbsent还挺好用. 这道题就是考察环形数组中两个元素间的距离是多少. 这里的环形数组就是26个英文字母. 我们都以顺时针为前进方向来计算距离. 注意17行和19行的‘8’是很有必要的. 因为11不能确定是三个字符两两间的距离都是1还是两个字符之间距离是11.

时间复杂度: O(n * m) n是string的个数, m是最长的string的长度. 我们遍历每一个string是O(n), 对于每个string我们要计算hash, 是O(m). 合在一起是O(m * n)
空间复杂度: O(n * m) 因为可能所有的string的hash都不相同.