LeetCode 884|两句话中的不常见单词:用哈希表统计词频的典型解法(InterviewGuide 题解)
文档教程知识库【免费下载链接】InterviewGuide「InterviewGuide」是阿秀从校园-职场多年计算机自学过程的记录以及学弟学妹们计算机校招秋招经验总结文章的汇总包括但不限于C/C 、Golang、JavaScript、Vue、操作系统、数据结构、计算机网络、MySQL、Redis等学习总结坚持学习持续成长项目地址https://gitcode.com/forthespada/InterviewGuide点击查看免费下载本篇是 InterviewGuide 仓库「精选力扣 300 题目之哈希表」Easy 分类下第 884 题的完整题解。围绕「不常见单词」的定义本文会讲清楚如何把计数问题翻译成哈希表统计词频给出仓库中原始记录的手写 C 解法并逐行剖析其切词与边界处理细节最后补充更简洁的istringstream写法并串联哈希表分类下的同类题目供刷题时对照复习。读完本文你将掌握「用unordered_map统计词频、再按频次筛选」这一类题目的标准套路以及面试手撕时需要注意的边界条件。题目回顾什么是不常见单词给定两个句子 A 和 B句子是一串由空格分隔的单词每个单词仅由小写字母组成如果一个单词在其中一个句子中只出现一次在另一个句子中却没有出现那么这个单词就是不常见的要求返回所有不常见单词的列表顺序不限。原始题解记录见 884.两句话中的不常见单词.md本文以此文档为主体展开。示例与约束示例 1输入A this apple is sweetB this apple is sour输出[sweet,sour]。其中this、apple、is都在两句中重复出现而sweet只在 A 中、sour只在 B 中。示例 2输入A apple appleB banana输出[banana]。apple虽然在 A 中出现了两次但既然它「出现不止一次」就不满足「只出现一次」的条件因此不是不常见单词。提示0 A.length 2000 B.length 200A 和 B 都只包含空格和小写字母。题目允许句子为空串长度可为 0这是后面实现中必须处理好的边界情况。解题思路把「不常见」翻译成「全局词频 1」本题看似在说「一个句子出现一次、另一个句子不出现」但如果把两句话合并看待条件可以等价改写为一个单词在 A、B 两个句子合并后的总词频中恰好只出现 1 次。原因很简单若单词只在一句话里出现一次另一句没有 → 合并后总频次为 1若单词在两句话里总共出现 2 次及以上无论是同一句内重复还是跨句重复→ 不满足「只出现一次」应被排除示例 2 中apple apple里的apple总频次为 2即使另一句没有也不符合条件。因此解题分为两步统计用一个哈希表C 的unordered_mapstring, int对两个句子中的所有单词分别计数筛选遍历哈希表取出所有value 1的键即单词本身放入结果数组返回。这一步的筛选是unordered_map最适合干的活——它以哈希方式组织键值插入和查询都是平均 O(1) 的复杂度且遍历时可以直接拿到「单词 → 出现次数」的完整对应关系。第一版实现仓库中记录的手写切词 unordered_map 统计原文档给出的第一版解法完全沿用了上述思路且没有借助split之类的库函数而是手动按空格切词代码如下vectorstring uncommonFromSentences(string A, string B) { unordered_mapstring,int un_mp; string temp; for (unsigned i0;iA.size();i) { temp ; while (A[i] ! i A.size()) { temp A[i]; } if (temp.size() 0) un_mp[temp]; } for (unsigned i 0; i B.size(); i) { temp ; while (B[i] ! i B.size()) { temp B[i]; } if (temp.size() 0) un_mp[temp]; } vectorstring res; for (auto a : un_mp) { if (a.second 1) res.push_back(a.first); //cout a.first a.second endl; } return res; }原文档记录了该版本提交时的表现历史提交数据来自 LeetCode 中文站执行用时4 ms击败约 91.83% 的 cpp 提交内存消耗8.7 MB击败约 100.00% 的提交。这段代码虽然「土」但在面试手撕场景下非常直观两次遍历分词、一次遍历筛词全程只用到一个unordered_mapstring, int空间占用只有「不同单词的个数」。逐行拆解手写切词的细节核心的切词循环是while (A[i] ! i A.size()) { temp A[i]; }这里有两个容易被忽略的细节循环条件的先后顺序先判断A[i] ! 再判断i A.size()。当i已经等于size()即扫描到字符串末尾之后时C 标准保证string::operator[]在i size()位置返回一个指向空字符\0的引用\0 ! 为真紧接着i A.size()为假循环安全退出不会越界访问。也就是说这种写法依赖「\0不等于空格」这一事实来兜底收尾。跳过空串if (temp.size() 0) un_mp[temp];保证即使句子中出现连续空格虽然题目约束下不会出现也不会把空串计入统计。同时在循环外层for的末尾i已经指向空格位置下一轮外层循环会i跳过该空格再进入下一轮切词。对 B 的第二次遍历与 A 完全对称。最终遍历哈希表时a.first是单词、a.second是出现次数只收集a.second 1的单词即可。由于unordered_map本身无序返回结果天然满足题目「可以按任何顺序返回列表」的要求。复杂度分析时间复杂度O(n)其中 n 为两个句子字符总长度。两轮分词各自线性扫描一遍句子最后一轮遍历哈希表也只需 O(k)k 为不同单词数总体为线性时间。空间复杂度O(k)k 为 A 和 B 中出现的不同单词总数哈希表只存储不重复的键值对。进阶写法用 istringstream 简化分词手写切词能帮助我们理解指针/下标推进的细节但生产级代码通常直接交给std::istringstream来做「按空格分词」代码更短、更不易出错#include sstream vectorstring uncommonFromSentences(string A, string B) { unordered_mapstring, int un_mp; istringstream iss(A B); // 合并两句话统一分词统计 string word; while (iss word) { un_mp[word]; } vectorstring res; for (auto it : un_mp) { if (it.second 1) res.push_back(it.first); } return res; }这里的改进点在于用A B把两句话拼成一句中间补一个空格之后一次while (iss word)就能把两个句子的所有单词全部喂进同一个哈希表免去了对 A、B 各写一遍的重复代码operator天然按空白符含空格切分且会自动跳过空串与第一版里temp.size() 0的判断效果一致统计与筛选两个阶段的结构保持不变逻辑与第一版完全等价只是实现更简洁。面试延伸哈希表分类下的同类题目串联「统计词频 → 按条件筛选」是哈希表分类下的高频套路本仓库哈希表模块中还收录了多道可对照练习的题目题目核心考点仓库路径387. 字符串中的第一个唯一字符用哈希表统计字符频次再按字符串顺序找第一个频次为 1 的字符easy/387.字符串中的第一个唯一字符.md1207. 独一无二的出现次数哈希表统计频次后再用unordered_set判断频次是否互不相同easy/1207.独一无二的出现次数.md290. 单词规律用两张哈希表建立字符↔单词的双向映射easy/290.单词规律.md205. 同构字符串字符之间双向映射判断是否一一对应easy/205.同构字符串.md970. 强整数用unordered_set完成去重再转成vector返回easy/970.强整数.md尤其值得对比的是 1207 题与本题1207 统计的是数字的出现次数再用unordered_set判重返回un_st.size() un_mp.size()本题统计的是单词的出现次数再按value 1筛选。两者共用同一套「哈希表计数」骨架只是筛选条件不同。刷题时可以把它们放在一起对照强化「统计 → 筛选」两步走的心智模型。小结不常见单词 合并后全局词频恰好为 1 的单词这是把题意转化为哈希表问题的关键一步实现上「手写切词 unordered_mapstring, int」与「istringstream分词」两种写法等价前者适合理解边界细节后者适合快速写出干净代码注意两个边界句子可能为空串长度 0以及切词循环中\0 ! 对越界收尾的兜底本题位于哈希表分类的 Easy 档与之相邻的 387、1207、290、205、970 等题目均可在 05-哈希表 目录下找到完整题解是面试前复习哈希表套路的高性价比组合。赞分享文档教程知识库【免费下载链接】InterviewGuide「InterviewGuide」是阿秀从校园-职场多年计算机自学过程的记录以及学弟学妹们计算机校招秋招经验总结文章的汇总包括但不限于C/C 、Golang、JavaScript、Vue、操作系统、数据结构、计算机网络、MySQL、Redis等学习总结坚持学习持续成长项目地址https://gitcode.com/forthespada/InterviewGuide点击查看免费下载相关推荐LogicStack-LeetCode 题解884. 两句话中的不常见单词哈希表 模拟LogicStack LeetCode 题解884. 两句话中的不常见单词哈希表 模拟 本文以 LogicStack LeetCode 仓库中 884教程文档两句话中的不常见单词NeetCode 哈希表计数解法全解析两句话中的不常见单词NeetCode 哈希表计数解法全解析 本篇技术指南聚焦 LeetCode 经典题目「Uncommon Words from Two Se示例工程教程AlgoNote 题解0884. 两句话中的不常见单词——用哈希表统计词频的字符串计数实战AlgoNote 题解0884. 两句话中的不常见单词——用哈希表统计词频的字符串计数实战 本篇是「算法通关手册」AlgoNote LeetCode 题解教程文档知识库上一篇如何在离线环境下使用Osintgram进行Instagram数据分析完整指南下一篇stdexec性能优化从入门到专家的完整调优指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

xdma驱动2019版本实战:编译、调优与避坑指南

xdma驱动2019版本实战:编译、调优与避坑指南

简介:这份资源为2019版XDMA驱动,面向使用Xilinx FPGA进行高速数据传输开发的工程师与学习者,可解决PCIe DMA通道搭建与驱动适配问题。XDMA驱动具备高吞吐量、低延迟特性,通常与Vivado 2019.2配合使用,也有搭配Vivado 2…

2026/10/12 1:33:50 阅读更多 →
5-Pin磁吸连接器从选型到量产:引脚定义、磁路设计与充电协议全解析

5-Pin磁吸连接器从选型到量产:引脚定义、磁路设计与充电协议全解析

1. 从一根线说起:为什么5-Pin磁吸连接器值得单独拿出来聊做智能穿戴和便携设备的人都有一个共同的痛:充电接口的可靠性,往往决定了整机的返修率。我见过太多项目,主板设计得漂漂亮亮,固件调得稳稳当当,最后…

2026/10/12 1:33:50 阅读更多 →
嵌入式闭环控制实战:绘图机与小车的硬件驱动与PID调试

嵌入式闭环控制实战:绘图机与小车的硬件驱动与PID调试

1. 项目概述:为什么这两个“小东西”值得花时间拆解?嵌入式项目推荐(第九期):小型绘图机与自动驾驶小车【开源】——这个标题里藏着两个看似不相关、实则技术内核高度同源的典型教学级硬件系统。我带过十几届嵌入式方向…

2026/10/12 1:33:50 阅读更多 →

最新新闻

【深度学习新浪潮】Meta Muse 智能体:它是什么?有哪些特点?为什么突然火了?

【深度学习新浪潮】Meta Muse 智能体:它是什么?有哪些特点?为什么突然火了?

1. 引言 近期,Meta Muse 智能体在 AI 领域引发广泛关注,开发者、创作者与科技从业者纷纷展开讨论。许多初次接触者不禁疑惑:这是 Meta 推出的又一款大模型?抑或仅是蹭热度的 AI 玩具? 事实并非如此。Meta Muse 是 Meta 在 AI 智能体方向的一次战略性布局,它并非简单的对…

2026/10/12 2:24:22 阅读更多 →
Spring-boot-3 -注解 yaml配置 -日志

Spring-boot-3 -注解 yaml配置 -日志

4、核心技能1. 常用注解SpringBoot 摒弃 XML 配置方式,改为全注解驱动1. 组件注册Configuration 自定义配置类、SpringBootConfiguration 用来标注SpringBoot主启动类的Bean 可以在自定义配置类面创建对象交给ioc容器,组件在容器中的名字为方法名、Scope…

2026/10/12 2:24:22 阅读更多 →
Neuroimage: 动态功能连接方法的重测信度比较

Neuroimage: 动态功能连接方法的重测信度比较

本篇文献发表在Neuroimage杂志。所发布内容旨在与大家分享学术新知,促进交流学习版权归原作者或原出处所有,感谢各位学者的辛勤付出与研究成果。1.引言大脑的功能组织具有丰富的时空结构,可以使用功能连接指标进行探测。功能连接被定义为两个…

2026/10/12 2:24:22 阅读更多 →
page_alloc __rmqueue

page_alloc __rmqueue

__rmqueue() 是伙伴系统分配路径的核心调度器。它在持有 zone->lock 的前提下,按照碎片化风险从低到高的顺序,依次尝试不同的分配策略,直到成功或彻底失败。核心作用与策略链它的本质是一个多级降级策略链:先尝试最“干净”的方…

2026/10/12 2:24:22 阅读更多 →
游戏引擎中物理步进与动画采样的同步机制解析

游戏引擎中物理步进与动画采样的同步机制解析

1. 这不是教科书,是我在三个项目里拆过七次引擎后写下的物理与动画系统手记“游戏引擎架构深度解析(三):物理与动画系统”——看到这个标题,你大概率正卡在某个角色落地时穿模、布料抖动像癫痫发作、或者刚加完一个新关…

2026/10/12 2:24:22 阅读更多 →
产业与汇率全景分析深入分析多表格形成一篇文章

产业与汇率全景分析深入分析多表格形成一篇文章

产业与汇率全景深度分析:汇率是外生变量,产业是底层根基引言汇率从来不是孤立的数字,它是一国产业竞争力、贸易结构、资本流动、宏观政策、全球供需格局共同定价的结果;反过来,汇率波动又会重塑产业成本、订单、利润、…

2026/10/12 2:23:21 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →