java版
public List<List<String>> groupAnagrams(String[] strs) {
if (strs == null || strs.length == 0) {
return null;
}
Map<String, List<String>> map = new HashMap<>();
for (String str : strs) {
int[] ints = new int[26];
char[] chars = str.toCharArray();
for (char c : chars) {
ints[c - 'a']++;
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 26; i++) {
if (ints[i] == 0) {
continue;
}
sb.append((char) (i + 'a'));
sb.append(ints[i]);
}
List<String> list = map.getOrDefault(sb.toString(), new ArrayList<>());
list.add(str);
map.put(sb.toString(), list);
}
return new ArrayList<List<String>>(map.values());
<p align=right>}</p>
C++版
vector<vector<string>> groupAnagrams(vector<string>& strs) {
vector<vector<string>> res;
if (strs.empty()) {
return res;
}
unordered_map<string, vector<string>> map;
for (string str : strs) {
int ints[26] = {0};
for (int i = 0; i < str.size(); i++) {
ints[str[i] - 'a']++;
}
string key = "";
for (int j = 0; j < 26; j++) {
if (ints[j] == 0) {
continue;
}
key.push_back((char)(j + 'a'));
key.push_back(ints[j]);
}
map[key].push_back(str);
}
for (auto& v : map) {
res.push_back(v.second);
}
return res;
}
总结
核心思想是通过数组来实现字母异位词的定位,对于乱序的相同字母,按照数组下标和数组的值来进行还原 然后通过数组下标和值(同一字母出现的次数)作为map的key进行组装,相同的放到一组; C++和java的基本处理思想一致,主要就是C++字符串作为数组进行push_back拼接。
打卡完成,继续坚持!!!希望友友们监督哈