//Given an array of strings strs, group the anagrams together. You can return th
//e answer in any order.
//
// An Anagram is a word or phrase formed by rearranging the letters of a differe
//nt word or phrase, typically using all the original letters exactly once.
//
//
// Example 1:
// Input: strs = ["eat","tea","tan","ate","nat","bat"]
//Output: [["bat"],["nat","tan"],["ate","eat","tea"]]
// Example 2:
// Input: strs = [""]
//Output: [[""]]
// Example 3:
// Input: strs = ["a"]
//Output: [["a"]]
//
//
// Constraints:
//
//
// 1 <= strs.length <= 104
// 0 <= strs[i].length <= 100
// strs[i] consists of lowercase English letters.
//
// Related Topics Array Hash Table String Sorting
// 👍 10416 👎 338
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
Map<String, List<String>> resultMap = new HashMap<>();
for (String str : strs) {
String key = generateKey(str);
resultMap.putIfAbsent(key, new ArrayList<>());
resultMap.get(key).add(str);
}
return new ArrayList<>(resultMap.values());
}
private String generateKey(String str) {
int[] nums = new int[26];
for (char ch : str.toCharArray()) {
nums[ch - 'a']++;
}
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < 26; i++) {
stringBuilder.append('a' + i).append(nums[i]);
}
return stringBuilder.toString();
}
}
//leetcode submit region end(Prohibit modification and deletion)