LeetCode49. 字母异位词分组(2024秋季每日一题 4)
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词:是由重新排列源单词的所有字母得到的一个新单词。
示例 1:
输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
示例 2:
输入: strs = [""]
输出: [[""]]
示例 3:
输入: strs = ["a"]
输出: [["a"]]
提示:
1 < = s t r s . l e n g t h < = 1 0 4 1 <= strs.length <= 10^4 1<=strs.length<=104
0 < = s t r s [ i ] . l e n g t h < = 100 0 <= strs[i].length <= 100 0<=strs[i].length<=100
s t r s [ i ] strs[i] strs[i] 仅包含小写字母
思路:
- 遍历给定的字符串数组,对每一个字符串,对其进行排序,如果不存在与 哈希表,则新建一个字符串数组,
- key=排序后的字符串,value=字符串数组的下标,hash[排序后的字符串]=字符串数组的下标,
- 例子:“ate”、“eat”,排序后都是 “aet”,所以可以通过排序判断 “字母异位词” 是否已经存在,
- 存在的话,通过 hash 表找出对应的数组,加入进去即可。
class Solution {
public:vector<vector<string>> groupAnagrams(vector<string>& strs) {vector<vector<string>> res;unordered_map<string, int> h;for(const string& s: strs){string back_str = s;sort(back_str.begin(), back_str.end());if(h.count(back_str)){int idx = h[back_str];res[idx].push_back(s);}else{vector<string> a;a.push_back(s);res.push_back(a);h[back_str] = res.size() - 1;}}return res;}
};