LeetCode 49.字母异位词分组

60 阅读1分钟

从零开始学习c++,每天起码做一道leetcode题目,在此记录,希望最后能够有所收获!

一、题目描述

49.字母异位词分组

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

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

示例 1:

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

示例 2:

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

示例 3:

输入: s = "IX"
输出: 9

提示:

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

二、思路分析

本题的一个关键之处就是找组成的字母出现次数相等的单词,但该如何记录每个单词中,构成这个单词的每个字母的出现次数是我没想明白的。后来才知道原来在c++中,字符串也可以直接排序。如果两个单词,构成它们的每个字母的出现次数相等,那排序后这两个字符串一定是相等的。

因此本题中就利用了map数据结构,来记录。map是一种数据结构,它可以存储键值对的形式的数据。每一个存储进map的数据都是一一对应的。Map的键可以是任意类型的值,不像对象只能用字符串或符号作为键。map还有一些其他的特性,比如支持排序,迭代,大小等。

map结构在很多场景下都有用处,比如存储配置信息,缓存数据,统计词频等。Map结构可以方便地根据键来获取或修改值,也可以遍历所有的键值对。

三、AC代码

class Solution {
public:
   
    vector<vector<string>> groupAnagrams(vector<string>& strs) {
        vector<vector<string>>ans;
        unordered_map<string,vector<string>>m;
        for(int i=0;i<strs.size();i++){
            string key=strs[i];
            sort(key.begin(),key.end());
            m[key].emplace_back(strs[i]);

        }
        for(auto it=m.begin();it!=m.end();it++){
            ans.emplace_back(it->second);

        }

    return ans;

    }
};

四、总结

对我而言还是有一定的难度