力扣-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统计次数,怎么说呢
- 本来就是想要把字母异位词映射才做的出现次数的数组,然后为了把数组映射为key,又重写了hash规则???
- 重写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 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步