题目地址:
https://leetcode.com/problems/group-anagrams/
给定一个字符串数组,如果两个字符串所含字母以及每个字母出现的次数相同,则视为等价。要求返回所有等价类。
思路是将等价的字符串统一化为一个代表元作为哈希表的key,然后将等价的元素都放在key对应的value里,最后再归结返回。代码如下:
import java.util.*;
public class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
List<List<String>> res = new ArrayList<>();
Map<String, List<String>> map = new HashMap<>();
for (String s : strs) {
char[] chars = s.toCharArray();
// 字符排序后的字符串就成了每个等价类的代表元
Arrays.sort(chars);
String cur = new String(chars);
map.putIfAbsent(cur, new ArrayList<>());
map.get(cur).add(s);
}
for (List<String> list : map.values()) {
res.add(list);
}
return res;
}
}
时间复杂度 O ( n l log l ) O(nl\log l) O(nllogl)。