字母异位词分组-力扣热题100道

字母异位词分组

49. 字母异位词分组

中等

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

字母异位词是由重新排列源单词的所有字母得到的一个新单词。

示例 1:

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

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

示例 2:

输入: strs = [""]

输出: [[""]]

示例 3:

输入: strs = ["a"]

输出: [["a"]]


解题思路

方法一:排序+哈希表

因为字母异位词的特点是 同为字母异位词的字符串所有的字母都相同,只是顺序不同。则按字母顺序后的字符串相同

  • 1.把所有字符串按照字母顺序排序,则所有为一组的字母异位词的字符串是一样的
  • 2.把排序后的字符串为键,把对应的没有排序的字符串作为值。则一个键下的值为以这个键的字符串中的字母组成的多个或一个字符串
  • 把哈希表中的值:同组字母组成的字符串 放入 结果中
  • 输出结果
c 复制代码
class Solution {
public:
    vector<vector<string>> groupAnagrams(vector<string>& strs) {

    unordered_map<string,vector<string>>str2;
    //定义一个哈希表,键=按字母顺序排好序的字符串,值=同为异位词的字符串
    for(string str:strs){
    //遍历strs中的每一个字符串,把每次遍历的字符串放到str中
        string tempstr=str;
        //把字符串给到tempstr
        sort(tempstr.begin(),tempstr.end());
        //对当前遍历到的字符串排序,sort函数用来排序,范围是从tempstr的开始(begin)到tempstr的结束
        str2[tempstr].push_back(str);
        //在str2的哈希表中找键为排序后的tempstr的向量,如果没有找到则在哈希表中新建一个键为tempstr的元素,值为空的string向量。
        //push_back把没有排序的str放入以tempstr为键的向量末尾做值
    }
    vector<vector<string>> res;
    //输出结果,由输出示例可以看出 结果为 一组由字符串向量组成的向量,所以定义一个由字符串向量组成的向量变量 res
    for(auto[_,strVec]:str2){
    //auto表示这个向量的类型为auto,[_,strVec]表示一个键值对,_在键的位置,表示我们不关注键,strVec提取对应的值,遍历str2中的每一个键值对
        res.push_back(strVec);
        //strVec对应的是同为字母异位词的多个或一个字符串,把每一个strVec放到res结果向量的后面
    }
    return res;//返回结果向量
    }
};

c 复制代码
补充:
在C++中,for(string str:strs)表示遍历strs中的字符串
- for表示循环
- string str:定义了一个类型为string的str变量,用来存储每次遍历的字符串
- strs: 被遍历的字符串,在这里是传入参数的strs

push_back()是vetor中的成员函数,把传入的参数放到指定的向量后面

我原本自己的思路:

1.按顺序取strs中的没有访问过的字符串,新建一个哈希表,设置访问数组

2.把取出来的字符串的每个字母转成ASCII码值作为存储在哈希表中的下标,出现一次哈希表中+1

3.取strs中在这个字符串后面的字符串

4.遍历哈希表,当不等于1处,把下标转成ASCII看取的后面字符串中是否有这个字母

如果其中一处不等于1的字母没有,则break,找下一个字符串

如果所有不等于1的下标对应的字母都有,则把这个字符串跟一开始取出来的字符串放一起,把这个字符串的访问数组下标设为1

5.继续找下一个没有被访问过的字符串,重复4的操作,一直找到strs中的字符串结束

注意:

没有利用字母异位词的 同组字母相同的特点。

  • 如果有 由相同元素组成的,可以先排序把他们变成相同的,再进行操作
相关推荐
小O的算法实验室12 小时前
2026年ASOC,基于深度强化学习的无人机三维复杂环境分层自适应导航规划方法,深度解析+性能实测
算法·无人机·论文复现·智能算法·智能算法改进
郭涤生13 小时前
STL vector 扩容机制与自定义内存分配器设计分析
c++·算法
༾冬瓜大侠༿13 小时前
vector
c语言·开发语言·数据结构·c++·算法
Ricky111zzz13 小时前
leetcode学python记录1
python·算法·leetcode·职场和发展
汀、人工智能13 小时前
[特殊字符] 第58课:两个正序数组的中位数
数据结构·算法·数据库架构··数据流·两个正序数组的中位数
liu****13 小时前
第16届省赛蓝桥杯大赛C/C++大学B组(京津冀)
开发语言·数据结构·c++·算法·蓝桥杯
汀、人工智能13 小时前
[特殊字符] 第79课:分割等和子集
数据结构·算法·数据库架构·位运算·哈希表·分割等和子集
汀、人工智能13 小时前
[特殊字符] 第74课:完全平方数
数据结构·算法·数据库架构·图论·bfs·完全平方数
CoderCodingNo13 小时前
【GESP】C++四、五级练习题 luogu-P1177 【模板】排序
数据结构·c++·算法
Proxy_ZZ013 小时前
从零实现LDPC比特翻转译码器:C语言实战与底层逻辑解析
c语言·算法