力扣-49-字母异位词分组

字母异位词就是:组成单词的字母相同,只是字母位置不同的单词

没什么思路,朴素思路,先全部放到set里,然后不空就取一个出来,回溯构造所有的异位词和set中匹配

public:
vector<vector<string>> groupAnagrams(vector<string>& strs) {
vector<vector<string>> res;
unordered_set<string> set;
for (string str : strs) set.emplace(str);
string temp;
while (!set.empty()) {
temp = *set.begin();
vector<string> tempVector;
tempVector.push_back(temp);
// 生成一个字符串的所有字母异位词
// 但是这样也太费时间了,如果单词很长呢?怕不是要超时
}
}

看了官解1-排序,2-计数,还有评论第一的质数乘积,本质上都是把字母异位词映射到map的key,只是映射方式不同

质数乘积可能有溢出问题?🤔就最多26个会溢出吗,好吧,考虑的是如果单词巨长的话

我想想,如果是排序的话应该是把每个char用ASCII码当作int来排,具体的效率取决于排序算法
试了下,C++的sort函数是支持stirng排序的,没记错的话官方sort函数时间复杂度log2n,可以了,直接用很方便

计数是计每个字母出现的次数官解说是拿数组对象作为key,但是具体怎么作为key?有待考量

我看了官方的2统计次数,怎么说呢

  1. 本来就是想要把字母异位词映射才做的出现次数的数组,然后为了把数组映射为key,又重写了hash规则???
  2. 重写hash规则我不会,也看不懂

所以我选择1,又快又方便,还没有隐含的问题,虽然效率低了点但也不至于不能看

class Solution {
public:
vector<vector<string>> groupAnagrams(vector<string>& strs) {
vector<vector<string>> res;
unordered_map<string, vector<string>> str_map;
string temp;
for (string str : strs) {
temp = str;
sort(str.begin(), str.end());
if (str_map.find(str) != str_map.end()) str_map[str].push_back(temp);
else str_map.emplace(str,vector<string> {temp});
}
for (auto a : str_map) res.push_back(a.second);
return res;
}
};

看到官方题解里把key是否存在直接省略掉了
🤔我想原理是这样,当key不存在的时候,会返回end()指针…

网上看到说:如果key不存在但是直接[key]访问的话,会自动插入一个新的key,并返回默认value

暂时不细研究,C++目前定位是只管用,用来刷题,非必要不研究

最终的代码如下:

vector<vector<string>> groupAnagrams(vector<string>& strs) {
vector<vector<string>> res;
unordered_map<string, vector<string>> str_map;
string temp;
for (string str : strs) {
temp = str;
sort(str.begin(), str.end());
str_map[str].push_back(temp);
}
for (auto a : str_map) res.push_back(a.second);
return res;
}

本文作者:YaosGHC

本文链接:https://www.cnblogs.com/yaocy/p/16978114.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   YaosGHC  阅读(38)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起