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

字母异位词(哈希映射法)

题目字母异位词是指两个字符串所含的字符种类与每种字符的数量完全相同仅字符的排列顺序不同。例如aabcbaaccbaa这三个字符串互为字母异位词。给定n个仅由小写英文字母组成的字符串请统计其中共有多少种不同的字母异位词类别即有多少组互为字母异位词的字符串集合。输入格式:第一行一个正整数n1≤n≤10000。接下来n行每行一个非空字符串每个字符串长度不超过1000且仅包含小写英文字母。输出格式:输出多行第一行为一个正整数表示不同的字母异位词类别的数量。接下来的多行每行输出一组字母异位词顺序和输入顺序一致两个字母异位词中间用一个空格分隔。输入样例:5abc bac def hik efd输出样例:3abc bacdef efdhik问题分析题目理解这道题的核心是识别字母异位词并分组输出。字母异位词的定义是字符种类和数量相同但排列顺序不同。例如abc、bac、cba是异位词都包含1个a、1个b、1个cabc和abd不是异位词字符种类不同算法思路本题采用的算法是哈希映射法核心思想是特征提取将每个字符串转化为它的特征向量即26个字母的计数数组哈希分组用特征向量作为key将所有相同特征的字符串放在一起顺序记录额外记录特征向量的出现顺序保证输出顺序符合要求代码详细分析#include bits/stdc.h using namespace std; // 数据结构定义 mapvectorint, vectorstring mp; // 哈希映射特征向量 - 该类的所有字符串 vectorvectorint v; // 记录特征向量的出现顺序 // 计算字符串的特征向量哈希值 vectorint get_hash(string s) { int ans[27]; // 计数数组实际只用0-25 // 初始化计数数组为0 for (int i 0; i 26; i) { ans[i] 0; } // 统计每个字母出现的次数 for (auto i : s) { ans[i - a]; // a对应下标0b对应1以此类推 } // 将计数数组转换为vector vectorint vec; for (int i 0; i 26; i) { vec.push_back(ans[i]); } return vec; } int main() { int n; cin n; // 处理每个输入的字符串 for (int i 1; i n; i) { string s; cin s; // 计算当前字符串的特征向量 vectorint tmp get_hash(s); // 如果是新的特征向量新的异位词类别记录它的出现顺序 if (!mp.count(tmp)) { v.push_back(tmp); } // 将当前字符串加入对应的类别 mp[tmp].push_back(s); } // 输出异位词类别的数量 cout mp.size() \n; // 按输入顺序输出每个类别 for (int i 0; i v.size(); i) { int size mp[v[i]].size(); // 当前类别的字符串数量 // 输出该类别的所有字符串 for (int j 0; j size; j) { cout mp[v[i]][j]; if (j ! size - 1) cout ; // 最后一个不加空格 } // 最后一行不加换行 if (i ! v.size() - 1) cout \n; } return 0; }算法核心特征向量的设计为什么用26个字母的计数数组作为特征因为两个字符串是字母异位词当且仅当它们的字母计数数组完全相同。例如abc→ [1,1,1,0,0,...]a出现1次b出现1次c出现1次其他0bac→ [1,1,1,0,0,...]完全相同aabc→ [2,1,1,0,0,...]不同a出现2次数据结构的巧妙运用1.mapvectorint, vectorstring mpKey:vectorint类型的特征向量Value:vectorstring存储该类的所有字符串为什么用map而不是unordered_mapvectorint可以作为map的key需要比较大小unordered_map需要为vectorint提供哈希函数这里简化处理2.vectorvectorint v记录特征向量出现的顺序因为map的遍历顺序是按照key排序的不是输入顺序用v保存顺序保证输出时按输入顺序算法流程示例以输入样例为例5 abc bac def hik efd处理过程abc→ 特征向量 [1,1,1,0,...] → mp中新增该类v记录该特征bac→ 同特征 [1,1,1,0,...] → 加入已有类别def→ 特征 [0,0,0,1,1,1,0,...] → 新增类别v记录hik→ 特征 [0,0,0,0,0,0,0,1,1,0,1,0,...] → 新增类别v记录efd→ 同def的特征 → 加入已有类别最终数据结构mp: [1,1,1,0,...] → [abc, bac] [0,0,0,1,1,1,0,...] → [def, efd] [0,0,0,0,0,0,0,1,1,0,1,0,...] → [hik] v: [[1,1,1,0,...], [0,0,0,1,1,1,0,...], [0,0,0,0,0,0,0,1,1,0,1,0,...]]输出3 abc bac def efd hik时间复杂度分析特征向量计算O(L)L为字符串长度本题L≤1000总计算O(n × L) ≤ 10000 × 1000 10^7可接受map操作O(log m)m为类别数可忽略空间复杂度分析存储所有字符串O(总字符数)特征向量每个类别26个int最多n个类别总结本题的算法精髓是特征提取用字母计数数组唯一标识异位词类别哈希分组用map将相同特征的字符串聚在一起顺序记录用额外的vector保持输入顺序AC代码#include bits/stdc.h using namespace std; //记录字符串顺序 mapvectorint, vectorstring mp; //记录异位词顺序 vectorvectorint v; //计算哈希值 vectorint get_hash(string s) { int ans[27]; for (int i 0; i 26; i) { ans[i] 0; } for (auto i : s) { ans[i - a]; } vectorint vec; for (int i 0; i 26; i) { vec.push_back(ans[i]); } return vec; } int main() { int n; cin n; for (int i 1; i n; i) { string s; cin s; //去重 vectorint tmp get_hash(s); if (!mp.count(tmp)) { v.push_back(tmp); } mp[tmp].push_back(s); } cout mp.size() \n; for (int i 0; i v.size(); i) { int size mp[v[i]].size(); for (int j 0; j size; j) { cout mp[v[i]][j]; if (j ! size - 1) cout ; } if (i ! v.size() - 1) cout \n; } return 0; }

相关文章:

字母异位词(哈希映射法)

题目字母异位词是指:两个字符串所含的字符种类与每种字符的数量完全相同,仅字符的排列顺序不同。 例如:aabc,baac,cbaa这三个字符串互为字母异位词。 给定n个仅由小写英文字母组成的字符串,请统计其中共有多…...

文科生小白入门AI量化:每天2小时,3个月跑通人生第一个LSTM模型

这是《AI量化学习手记》系列的第一篇文章。在这个系列里,我会以学习者的视角,记录从零开始学AI量化的真实经历——踩过的坑、填过的土、试过的方法、翻过的车。不讲大道理,只分享真问题。今天这篇,是我入门3个月的真实复盘&#x…...

阿里云 AI 中间件重磅发布,打通 AI 应用落地“最后一公里”

阿里云 AI 中间件重磅发布:打通 AI 应用落地“最后一公里” 阿里云近期发布的 AI 中间件旨在解决 AI 应用落地中的关键问题,包括模型部署、性能优化、资源管理和服务集成。这一中间件通过标准化接口和工具链,显著降低了 AI 从开发到生产的门槛…...

告别“在我机器上能跑”:Docker 容器化入门,小白也能秒懂!

告别“在我机器上能跑”:Docker 容器化入门,小白也能秒懂! 各位在代码的海洋里扑腾(或者溺水)的朋友们,大家好! 我是你们的老朋友,那个在键盘上敲击出无数个 bug(哦不&…...

CSV 数据文件设置的使用

打开 JMeter → 新建测试计划 → 添加 线程组。右键线程组 → 添加 → 配置元件 → CSV 数据文件设置。核心配置项(按界面顺序):表格配置项说明常用设置文件名CSV 文件路径(绝对 / 相对)推荐相对路径:./dat…...

充电桩小程序开发全解析(技术实操+架构设计+合规指南)

随着新能源汽车保有量激增,充电设施供需矛盾日益突出,充电桩小程序凭借“轻量化操作、智能管控、高效适配”的优势,成为连接用户、运营商与充电桩设备的核心载体,也是当前新能源赛道的热门开发方向。不同于普通服务类小程序&#…...

算法刷题 JavaScript 工具手册

文章目录 算法刷题 JavaScript 工具手册一、Array 数组常用操作1.1 尾部插入或者删除元素 push / pop1.2 头部插入或者删除元素 unshift/shift1.3 返回一个新数组 map1.4 过滤数组filter1.5 把数组压缩成一个值reduce1.6 原数组就地排序sort1.7 从数组中截取一段并返回新数组 s…...

Visual StudioProfiler对工作流进行热点分析

热点:消耗了绝大部分CPU计算时间(例如超过50%或更高比例)的那部分代码。Visual Studio 中,使用性能探查器(Profiler)在 Visual Studio 中,使用性能探查器(Profiler)进行热…...

bash: mysql: 未找到命令

永久生效(添加到环境变量,推荐)步骤 1:编辑环境变量配置文件bash运行# 编辑~/.bashrc(仅当前用户生效),或/etc/profile(所有用户生效) vim ~/.bashrc步骤 2:添…...

欧意下载okxz.run复制打开 最新地址分享(安卓苹果通用)

欧意下载okxz.run复制打开 最新地址分享(安卓苹果通用)1983年8月18日中午11 - 13点出生的人,其性格、运势与命运有着独特的轨迹。在这个特定的时空点降临世间,他们带着彼时星辰赋予的特质,开启了人生之旅。这类人往往性…...

Java毕业设计基于SpringBoot的中药材管理系统25853136

前言 基于Spring Boot的中药材管理系统适用于中药材企业、中药材批发市场、中药材种植基地等场景,可以满足企业对中药材从采购、入库、存储到销售全过程的管理需求。同时,该系统还可以通过扩展和定制来满足企业的特定需求,如集成更多的支付接…...

动态规划-

斐波那契数列class Solution {public int fib(int n) {int [] nums new int [n1];if (n < 1) {return n;}nums[0]0;nums[1]1;for(int i2;i<n1;i){nums[i]nums[i-1]nums[i-2];}return nums[n];} }爬楼梯class Solution { public int climbStairs(int n) {int[] dp new in…...

英伟达GTC 2026“芯片全家桶”震撼登场,微美全息构建全栈算力创新体系迎风而上

据消息&#xff0c;北京时间 3 月 17 日凌晨&#xff0c;被誉为“AI界春晚”的英伟达&#xff08;NVDA.US&#xff09;GTC大会正式启幕。芯片全家桶上线作为全球 AI 产业受关注的年度时刻之一&#xff0c;今年GTC大会&#xff0c;除AI智能体平台、Rubin Ultra芯片等新技术、新产…...

使用Jsoup爬取豆瓣电影Top250(附Java代码)

在日常开发中&#xff0c;我们经常需要从网页上获取数据&#xff0c;而手动复制粘贴显然太低效。今天我们就来学习如何使用Java的Jsoup库&#xff0c;快速爬取豆瓣电影Top250的片名和评分&#xff0c;只需几十行代码就能搞定。 一、Jsoup简介 Jsoup 是一个开源的Java HTML解析…...

ABB机器人仿真工作站:超便捷教学实训平台

ABB机器人仿真工作站&#xff0c;教学实训平台&#xff0c;提供软件的时候全部模型&#xff0c;压缩成工作站文件&#xff0c;解压即可使用。 提供的是工作站的全部模型。最近发现了一个超赞的ABB机器人仿真工作站教学实训平台&#xff0c;必须来和大家分享一下。对于学习机器人…...

计算其中最大连续 1 的个数

题目给定一个二进制数组 nums &#xff0c; 计算其中最大连续 1 的个数。示例 1&#xff1a;输入&#xff1a;nums [1,1,0,1,1,1] 输出&#xff1a;3 解释&#xff1a;开头的两位和最后的三位都是连续 1 &#xff0c;所以最大连续 1 的个数是 3.示例 2:输入&#xff1a;nums …...

Linux系统基础认知

作为学习者&#xff0c;我仅将所学知识进行系统梳理和总结。如有任何疏漏或错误&#xff0c;敬请指正Linux系统基础认知核心概念内核与发行版 Linux内核是系统的核心组件&#xff0c;由林纳斯托瓦兹于1991年开发。发行版是“内核配套软件”的完整系统&#xff0c;例如Ubuntu、K…...

d3dx10_36.dll文件错误 完全免费下载修复方法分享

在使用电脑系统时经常会出现丢失找不到某些文件的情况&#xff0c;由于很多常用软件都是采用 Microsoft Visual Studio 编写的&#xff0c;所以这类软件的运行需要依赖微软Visual C运行库&#xff0c;比如像 QQ、迅雷、Adobe 软件等等&#xff0c;如果没有安装VC运行库或者安装…...

DevSecOps平台建设之必备数据库MySQL

MySQL 是最流行的关系型数据库管理系统&#xff0c;在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System&#xff1a;关系数据库管理系统)应用软件之一。在本教程中&#xff0c;会让大家快速掌握 MySQL 的基本知识&#xff0c;并轻松使用 MySQL 数据库…...

django flask+uniapp宠物用品商城领养寄养医疗中心信息管理系统app 小程序_i843n

目录技术选型与架构设计功能模块划分数据模型设计接口开发规范小程序端实现部署与运维方案项目技术支持可定制开发之功能创新亮点源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作技术选型与架构设计 后端框架选择Django和Flask的混合架构。…...

自研匹配算法:跨越平台的高效之路

自研模板匹配&#xff0c;形状匹配&#xff0c;方形匹配&#xff0c;圆形匹配&#xff0c;十字匹配&#xff0c;C/C#动态库接口&#xff0c;windows/linux/arm64/aarch64&#xff0c;速度接近halcon在计算机视觉领域&#xff0c;模板匹配、形状匹配等技术是众多应用的基石。今天…...

1393、STM32单片机智能小车倒车入库 侧方停车入库 超声波加红外避障检测入库小车设计(程序+原理图+硬件设计资料+参考论文+参考开题报告+制作详解+元器件清单)

具体详情请看&#xff1a; 1393、STM32单片机智能小车倒车入库 侧方停车入库 超声波加红外避障检测入库小车设计(程序原理图硬件设计资料参考论文参考开题报告制作详解元器件清单)-CSDN博客 演示操作视频讲解如下&#xff1a; https://www.douyin.com/video/7617736020217365…...

GYM106259F

GYM106259F 先排序 这样不用取绝对值 每一场的概率是一样的 一共n*(n-1)/2场 选择n-1 场 每场的贡献就是2/n(a[i]-a[i-1]) 可以前缀和求也可以考虑贡献 这里讲解贡献法 对于i到j 如果选择a[j]-a[i] 我们可以看作a[j]-a[j-1]a[j-1]-a[j-2].......a[i1]-a[i] 如果这么…...

OpenClaw 环境踩坑到头大?国产平替 EasyClaw 全链路实操:部署 + 多平台互联 + Agent 调教 + 自定义技能开发

前言 作为开发者和技术从业者&#xff0c;相信你大概率踩过这些坑&#xff1a;想通过 OpenClaw 搭建个人 AI 自动化助理&#xff0c;光 Node.js、Python、Git 环境配置就折腾了大半天&#xff0c;不是版本冲突就是依赖缺失&#xff1b;好不容易跑通基础流程&#xff0c;想对接…...

2026免费降AI工具性价比排行:穷学生怎么选

2026免费降AI工具性价比排行&#xff1a;穷学生怎么选 月底了&#xff0c;生活费还剩200。论文AI率58%&#xff0c;学校要求降到20%以下才能参加答辩。花不起几百块找人代改&#xff0c;手动改又改不动。 这种情况我太熟了。去年帮学弟处理毕业论文的时候就遇到过类似场景。当时…...

Kotlin的扩展函数与中缀表达式:DSL设计的利器

Kotlin的扩展函数与中缀表达式&#xff1a;DSL设计的利器 Kotlin作为一门现代化的编程语言&#xff0c;凭借其简洁性和灵活性&#xff0c;在开发领域广受欢迎。其中&#xff0c;扩展函数和中缀表达式是Kotlin的两大特色功能&#xff0c;它们不仅提升了代码的可读性&#xff0c…...

220V降5V,30MA封装SOP-8,WD5201应用于小家电消费类线性稳压器

WD5201作为一款高性能能效管理AI芯片&#xff0c;以AI赋能能效调控&#xff0c;以高集成简化设计&#xff0c;以全场景适配打破应用边界&#xff0c;为多行业提供智能、高效、节能的能效管理解决方案&#xff0c;引领能效管理进入智能化新时代。AI智控核心&#xff0c;解锁精准…...

Python的__init_subclass__框架中

Python的__init_subclass__框架&#xff1a;解锁类继承的隐藏能力在Python的面向对象编程中&#xff0c;类继承是一个强大的工具&#xff0c;但你是否知道Python还提供了一个名为__init_subclass__的特殊方法&#xff1f;这个隐藏在类构造机制中的钩子方法&#xff0c;能够让你…...

c语言之宏定义处理编译期间判断结构体大小

typedef struct sysparam {int battery; // 电池int flash; // flashint microphone; // 录音 麦克风char sn[24]...

干货合集:9个降AIGC工具测评!全行业通用降AI率必备清单

在当前学术与写作领域&#xff0c;AI生成内容&#xff08;AIGC&#xff09;的广泛应用带来了前所未有的效率提升&#xff0c;但也引发了对原创性与查重率的担忧。无论是学生、研究人员还是职场人士&#xff0c;都面临着一个共同的问题&#xff1a;如何在保持内容质量的同时&…...