当前位置: 首页 > news >正文

LeetCode热题100精讲——Top2:字母异位词分组【哈希】

在这里插入图片描述

你好,我是安然无虞。

文章目录

    • 题目背景
    • 字母异位词分组
      • C++解法
      • Python解法

在这里插入图片描述

题目背景

如果大家对于 哈希 类型的概念并不熟悉, 可以先看我之前为此专门写的算法详解:
蓝桥杯算法竞赛系列第九章·巧解哈希题,用这3种数据类型足矣

字母异位词分组

题目链接:字母异位词分组

在这里插入图片描述

解题思路:参考:《la bu la dong》

本题也是异位词相关,异位词这类问题的关键在于,如何迅速判断两个字符串是异位词,主要考察我们数据编码和 哈希表的使用:

是否可以找到一种编码方法,使得字母异位词的编码都相同?找到这种编码方式之后,就可以用一个哈希表存储编码相同的所有异位词,得到最终的答案。

242. 有效的字母异位词 考察了异位词的编码问题,对字符串排序可以是一种编码方案,如果是异位词,排序后就变成一样的了,但是这样时间复杂度略高,且会修改原始数据。更好的编码方案是利用每个字符的出现次数进行编码,也就是下面的解法代码。

代码详解:

C++解法

class Solution {
public:
    vector<vector<string>> groupAnagrams(vector<string>& strs) 
    {
        // 建立编码到分组的映射
        unordered_map<string, vector<string>> encodeToGroup;

        // 将相同编码的字符串放到一个分组中
        for(auto& str : strs)
        {
            // 对字符串进行编码
            string code = encode(str);

            // 将相同编码的字符串放到一起
            encodeToGroup[code].push_back(str);
        }

        // 统计结果
        vector<vector<string>> res;
        for(auto& group : encodeToGroup)
        {
            res.push_back(group.second);
        }

        return res;
    }

    // 对字符串中字符的出现次数进行编码
    string encode(string& s)
    {
        vector<int> hashNums(26);

        for(int i = 0; i < s.size(); i++)
        {
            hashNums[s[i] - 'a']++;
        }

        string code(hashNums.begin(), hashNums.end());

        return code;
    }
};

Python解法

class Solution:
    def groupAnagrams(self, strs: List[str]) -> List[List[str]]:

        # 建立编码后的字符串到分组的映射
        codeToGroup = {}
        for s in strs:
            # 将字符串进行编码
            code = self.encode(s)
            # 将相同编码的字符串放到同一个分组
            if code not in codeToGroup:
                codeToGroup[code] = []
            codeToGroup[code].append(s)

        # 获取结果
        res = []
        for group in codeToGroup.values():
            res.append(group)

        return res 

    def encode(self, s: str) -> str:
        # 按照字符出现次数进行编码
        count = [0] * 26 # 创建了一个长度为 26 的列表,每个元素都初始化为 0. 这个列表用于记录每个字母(从 'a' 到 'z')在字符串 中出现的次数.

        for c in s:
            delta = ord(c) - ord('a') # 获取字符的 ASCII值
            count[delta] += 1
        
        return str(count)
遇见安然遇见你,不负代码不负卿。
谢谢老铁的时间,咱们下篇再见~

相关文章:

  • 鲲鹏服务器,系统为:openEuler22.03-LTS (aarch64)Dify 安装教程(详细版)
  • 开发中常用的设计模式 用法及注意事项【面试题】
  • 路由工程师大纲-2:结合AI技术构建路由拓扑与BGP异常检测的知识链体系
  • (UI自动化测试web端)第二篇:元素定位的方法_xpath路径定位
  • 第七章 | Solidity 合约继承与接口全面讲解
  • Git冲突解决
  • MySQL的InnoDB 与 MyISAM 在性能方面不同,适应不同系统的说明
  • 基于C语言实现的观察者模式 以温度监控系统为例
  • python实战,提取数据汇聚到表格中
  • 数据结构--顺序表(实现增删改查)
  • 【C++初阶】---类和对象(上)
  • Vue.js 应用的入口文件main.js
  • BetterDiscord macOS
  • win7忘记密码_通过MS17-010打进去_创建管理员账户
  • 做一个有天有地的css及html画的旋转阴阳鱼
  • Next.js中not-found.js触发方式详解
  • Unity Render Streaming项目之Multiplay经验
  • 【构建CV图像识别系统】从传统方法到深度学习
  • LangChain组件Tools/Toolkits详解(5)——返回产出artifact
  • 蓝桥杯真题 2109.统计子矩阵
  • 观察|“双雄”格局下电池制造商如何生存:加码不同技术、抢滩新赛道
  • 反制美国钢铝关税!印度拟对美国部分商品征收关税
  • 季子文化与江南文化的根脉探寻与融合
  • 教育部:启动实施县中头雁教师岗位计划,支撑县中全面振兴
  • 左娅︱悼陈昊
  • 俄总统新闻秘书:普京提议谈判表明俄寻求和平解决方案意愿