从零开始学习c++,每天起码做一道leetcode题目,在此记录,希望最后能够有所收获!
一、题目描述
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母通常恰好只用一次。
示例 1:
输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
示例 2:
输入: strs = [""]
输出: [[""]]
示例 3:
输入: s = "IX"
输出: 9
提示:
1 <= strs.length <= 1040 <= strs[i].length <= 100strs[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;
}
};
四、总结
对我而言还是有一定的难度