字母异位词分组

104 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 5 天,点击查看活动详情

给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。

字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母通常恰好只用一次。

示例 1:

输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"] 输出: [["bat"],["nat","tan"],["ate","eat","tea"]]

示例 2:

输入: strs = [""] 输出: [[""]]

示例 3:

输入: strs = ["a"] 输出: [["a"]]

提示:

1 <= strs.length <= 104
0 <= strs[i].length <= 100
strs[i] 仅包含小写字母

说明

其实一下两个题目是哈希表中比较经典的题目就是通过设计哈希表中的键值进行归类(将相同键值的字符串都push到容器中便于后面单独取出) 举例:比如说字符串 “eat” 和 “ate” 应该在同一组中。但是 “eat” 和 “act” 不应该组合在一起,那么这个是如何分组呢?通过观察发现组成字符串的字符都完全一样就可以分到一组,不同则是不同组别。 例子结论总结:

属于同一组的所有值都将映射到同一组中。
需要分成不同组的值不会映射到同一组。

思路分析:

根据题目给的示例知道字母异位词定义:两个字符串互为字母异位词,当且仅当两个字符串包含的字母相同。 同一组字母异位词中的字符串具备相同点,可以使用相同点作为一组字母异位词的标志,使用哈希表存储每一组字母异位词,哈希表的键为一组字母异位词的标志,哈希表的值为一组字母异位词列表。

实现

遍历每个字符串,对于每个字符串,得到该字符串所在的一组字母异位词的标志,将当前字符串加入该组字母异位词的列表中。遍历全部字符串之后,哈希表中的每个键值对即为一组字母异位词。由于互为字母异位词的两个字符串包含的字母相同,因此对两个字符串分别进行排序之后得到的字符串一定是相同的,故可以将排序之后的字符串作为哈希表的键

代码

class Solution {
public:
    vector<vector<string>> groupAnagrams(vector<string>& strs) {
        /* 根据返回值定义存储结果的变量 */
        vector<vector<string>> result;

        unordered_map<string, vector<string>> map;
        for (string& str: strs) {
            string key = str;
            /* 将串排序后便于同一作为键 */
            sort(key.begin(), key.end());
            /* 将相同键值的字符串放入vector容器中 */
            map[key].push_back(str);//emplace_back
        }
        /* 取出相同键值的vector */
        for (auto it = map.begin(); it != map.end(); ++it)
            result.push_back(it->second);

        return result;
    }
};