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

注意:

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

  • 如果有 由相同元素组成的,可以先排序把他们变成相同的,再进行操作
相关推荐
生成论实验室4 分钟前
《事件关系阴阳博弈动力学:识势应势之道》第四篇:降U动力学——认知确定度的自驱演化
人工智能·科技·神经网络·算法·架构
AI科技星17 分钟前
全域数学·72分册:场计算机卷【乖乖数学】
算法·机器学习·数学建模·数据挖掘·量子计算
科研前沿1 小时前
镜像孪生VS视频孪生核心技术产品核心优势
大数据·人工智能·算法·重构·空间计算
水蓝烟雨1 小时前
1931. 用三种不同颜色为网格涂色
算法·leetcode
晨曦夜月2 小时前
map与unordered_map区别
算法·哈希算法
Morwit2 小时前
QML组件之间的通信方案(暴露子组件)
c++·qt·职场和发展
图码2 小时前
如何用多种方法判断字符串是否为回文?
开发语言·数据结构·c++·算法·阿里云·线性回归·数字雕刻
handler012 小时前
Linux 内核剖析:进程优先级、上下文切换与 O(1) 调度算法
linux·运维·c语言·开发语言·c++·笔记·算法
minglie12 小时前
实数列的常用递推模式
算法
代码小书生3 小时前
math,一个基础的 Python 库!
人工智能·python·算法