字母异位词分组-力扣热题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中的字符串结束

注意:

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

  • 如果有 由相同元素组成的,可以先排序把他们变成相同的,再进行操作
相关推荐
夏乌_Wx3 分钟前
练题100天——DAY28:找消失的数字+分发饼干
数据结构·算法
studytosky32 分钟前
深度学习理论与实战:反向传播、参数初始化与优化算法全解析
人工智能·python·深度学习·算法·分类·matplotlib
WolfGang00732133 分钟前
代码随想录算法训练营Day48 | 108.冗余连接、109.冗余连接II
数据结构·c++·算法
努力学算法的蒟蒻1 小时前
day35(12.16)——leetcode面试经典150
算法·leetcode·面试
cccc来财1 小时前
角点检测算法:Harris 和 FAST 方法
算法·计算机视觉·特征提取
风中月隐1 小时前
C语言中以坐标的方式图解“字母金字塔”的绘制
c语言·开发语言·算法·字母金子塔·坐标图解法
q_30238195561 小时前
告别“笨重”检测!VA-YOLO算法让疲劳驾驶识别更轻更快更准
算法·yolo
松涛和鸣2 小时前
DAY32 Linux Thread Programming
linux·运维·数据库·算法·list
LYFlied2 小时前
【每日算法】LeetCode 234. 回文链表详解
算法·leetcode·链表
NeDon2 小时前
[OJ]数据结构:移除链表元素
c语言·数据结构·算法·链表