648. 单词替换
题目描述在英语中我们有一个叫做词根(root) 的概念可以词根后面添加其他一些词组成另一个较长的单词——我们称这个词为衍生词(derivative)。例如词根help跟随着继承词ful可以形成新的单词helpful。现在给定一个由许多词根组成的词典dictionary和一个用空格分隔单词形成的句子sentence。你需要将句子中的所有衍生词用词根替换掉。如果衍生词有许多可以形成它的词根则用最短的词根替换它。你需要输出替换之后的句子。示例 1输入dictionary [cat,bat,rat], sentence the cattle was rattled by the battery输出the cat was rat by the bat示例 2输入dictionary [a,b,c], sentence aadsfasf absbs bbab cadsfafs输出a a b c题解class Mycompare { public: bool operator()(string s1,string s2) { return s1.size()s2.size(); } }; class Solution { public: string replaceWords(vectorstring dictionary, string sentence) { vectorstring strs; int start 0; int end0; for(;endsentence.size();end){ if(sentence[end] ){ string sub sentence.substr(start,end-start); start end1; strs.push_back(sub); } } string sub sentence.substr(start,end-start); strs.push_back(sub); sort(dictionary.begin(),dictionary.end(),Mycompare()); string res ; for(int i0;istrs.size();i){ bool flag false; for(int j0;jdictionary.size();j){ if(strs[i].find(dictionary[j])0){ res dictionary[j]; flag true; res ; break; } } if(!flag){ resstrs[i]; res ; } } return res.substr(0,res.size()-1); } };超出时间限制注意std::string::find(const string substr)返回的是size_t类型即std::string::size_type表示子串首次出现的索引位置。如果没找到返回的是std::string::npos一个特殊的size_t值通常是-1的无符号形式当前的代码时间复杂度是分割句子O(L)L 是句子长度排序词典O(M log M)M 是词典大小匹配过程O(N × M × K)其中N 单词数M 词典大小K 平均前缀比较长度find的开销⚠️瓶颈在双重循环 string::find—— 即使你按长度排序并break最坏情况下仍要遍历整个词典。最优解法使用 Trie前缀树Trie 可以将匹配过程从O(M·K)降到O(K)每个单词总时间复杂度降至 O(L total_chars_in_dictionary)。而且天然保证“最短前缀优先”—— 一旦在 Trie 中遇到一个标记为词根的节点立即返回无需排序class Solution { // 定义 Trie 节点结构 struct Trie { string word; // 如果该节点是一个词根的结尾则存储该词根否则为空 Trie* children[26] {}; // 指向子节点的指针数组对应 a 到 z }; public: string replaceWords(vectorstring dict, string sentence) { // 创建 Trie 根节点 Trie* root new Trie(); // 1️⃣ 将词典中的所有词根插入 Trie for (auto w : dict) { Trie* cur root; // 从根节点开始插入 for (char c : w) { int idx c - a; // 将字符转换为 0~25 的索引 // 如果当前字符对应的子节点不存在则创建新节点 if (!cur-children[idx]) { cur-children[idx] new Trie(); } // 移动到子节点 cur cur-children[idx]; } // 只有当该节点尚未存储词根时才保存当前词避免长词覆盖短词 // 注意由于我们不预先对 dict 排序这里“先插入的优先” // 但 LeetCode 测试用例中即使后插入更短的词也不会覆盖 // 所以更安全的做法是先对 dict 按长度排序或在查询时保证最短匹配。 // 不过本题中只要在查询时“首次命中就返回”就能保证最短前缀。 if (cur-word.empty()) { cur-word w; } } // 2️⃣ 分割句子并逐个处理单词 string res; // 最终结果字符串 string word; // 临时存储每个单词 istringstream iss(sentence); // 使用 stringstream 按空格分割句子 while (iss word) { // 依次读取每个单词 Trie* cur root; // 从 Trie 根节点开始查找 for (char c : word) { // 如果当前路径已断节点为空 或 子节点不存在跳出 if (!cur || !cur-children[c - a]) { break; } // 进入下一个字符对应的子节点 cur cur-children[c - a]; // ✅ 关键一旦发现当前路径构成一个词根word 非空立即替换 // 因为我们是从前往后遍历单词第一个匹配的词根一定是最短的 if (!cur-word.empty()) { word cur-word; // 替换为词根 break; // 停止继续匹配更长的前缀 } } // 将处理后的单词加入结果注意处理空格 if (!res.empty()) { res ; } res word; } return res; } };补充使用stringstream适合空格、制表符等空白字符分割#include iostream #include sstream #include string #include vector int main() { std::string input apple\tbanana cherry\n date \t\telderberry; std::stringstream ss(input); std::string word; std::vectorstd::string tokens; // 使用 操作符从 stringstream 中逐个读取非空白 token while (ss word) { tokens.push_back(word); } // 输出结果 for (const auto w : tokens) { std::cout w \n; } return 0; }apple banana cherry date elderberrystd::stringstream的operator默认以任意空白字符包括空格、\t、\n、\r、\f、\v作为分隔符。它会自动跳过多余的空白包括开头、结尾和中间连续的空白非常适合解析由空白分隔的“单词”或“字段”。

相关新闻

深入解析:调用识货平台列表搜索API获取商品数据

深入解析:调用识货平台列表搜索API获取商品数据

引言 在电商数据分析和比价应用中,获取可靠的商品列表信息是关键。识货平台作为一个知名的导购社区,其提供的搜索接口是开发者获取热门商品数据的重要途径。本文将详细解析如何调用识货的列表搜索API,包括接口地址、参数传递、签名验证以及响…

2026/7/5 5:53:49 阅读更多 →
【大模型系列文章】检索增强生成(RAG,Retrieval Augmented Generation)方法(4/5)

【大模型系列文章】检索增强生成(RAG,Retrieval Augmented Generation)方法(4/5)

⚡⚡⚡ 新年新文⚡⚡⚡ 文章目录前言1 什么是RAG2 RAG的实现原理3 RAG应用案例:阿里云AI助理4 实践案例4.1 搭建一个知识问答机器人4.2 10分钟为网站增加AI助手4.3 思考问题5 持续改进RAG应用5.1 评测优先:建立持续优化的基础5.2 建立评测标准6 如何归因…

2026/7/5 16:18:34 阅读更多 →
收藏!一文彻底搞懂Transformer中的归一化技术,大厂面试必考

收藏!一文彻底搞懂Transformer中的归一化技术,大厂面试必考

在Transformer面试里,“归一化”绝对是高频考点,而且是分层考察——初级岗问你“是什么”,中级岗问你“有啥区别”,资深岗直接追问“大厂实际怎么用、怎么演进的”。很多人栽就栽在最后一步:能说清LayerNorm大概是啥&a…

2026/7/3 19:30:07 阅读更多 →

最新新闻

Claude Code 实战:AI 结对编程如何真正提效,从简历表达讲到项目复盘

Claude Code 实战:AI 结对编程如何真正提效,从简历表达讲到项目复盘

聊《Claude Code 实战:AI 结对编程如何真正提效,从简历表达讲到项目复盘》之前,先说一句实在的:别急着背概念,先看它在真实项目里到底解决什么问题。摘要这篇面向正在评估 Claude Code 的开发者,但不会把“…

2026/7/6 0:39:26 阅读更多 →
PyTorch CRF 实战:BERT-CRF 命名实体识别 F1 值提升 5% 的 3 个关键点

PyTorch CRF 实战:BERT-CRF 命名实体识别 F1 值提升 5% 的 3 个关键点

PyTorch CRF 实战:BERT-CRF 命名实体识别 F1 值提升 5% 的 3 个关键点在自然语言处理领域,命名实体识别(NER)一直是一项基础而重要的任务。随着预训练语言模型如BERT的广泛应用,基于BERT的序列标注模型已成为NER的主流…

2026/7/6 0:37:25 阅读更多 →
终极指南:5分钟快速上手浏览器端人体姿态搜索工具

终极指南:5分钟快速上手浏览器端人体姿态搜索工具

终极指南:5分钟快速上手浏览器端人体姿态搜索工具 【免费下载链接】pose-search x6ud.github.io/pose-search 项目地址: https://gitcode.com/gh_mirrors/po/pose-search 想要在浏览器中实现专业级的人体姿态识别与动作搜索功能吗?pose-search是一…

2026/7/6 0:37:25 阅读更多 →
74HC32与PIC18F45K50实现高效键盘管理方案

74HC32与PIC18F45K50实现高效键盘管理方案

1. 为什么需要74HC32配合PIC18F45K50管理键盘?在嵌入式系统设计中,IO资源永远是稀缺品。传统2x2矩阵键盘需要占用4个IO口(2行2列),而采用74HC32或门芯片后,仅需2个IO即可实现4个按键的独立检测——这正是该…

2026/7/6 0:35:25 阅读更多 →
openEuler/QoS-Deployment-Test:从零开始编写自定义测试用例的完整指南

openEuler/QoS-Deployment-Test:从零开始编写自定义测试用例的完整指南

openEuler/QoS-Deployment-Test:从零开始编写自定义测试用例的完整指南 【免费下载链接】QoS-Deployment-Test Docker-based openEuler Online-Offline Co-scheduling Test Suite. 项目地址: https://gitcode.com/openeuler/QoS-Deployment-Test 前往项目官网…

2026/7/6 0:35:25 阅读更多 →
故障复盘——让失败“变成财富“

故障复盘——让失败“变成财富“

故障复盘——让失败"变成财富" 你有没有过考试错题本? 生活场景:错题本的作用 没有错题本 你考试考砸了: 错了3道题 订正了 忘了为什么错 下次考类似的,还是错 没有复盘,错误会重复。 有错题本 你考试考砸了: 错题记到本子上 分析错误原因 总结解题方法 …

2026/7/6 0:35:25 阅读更多 →

日新闻

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2与MySQL单元测试兼容性:5个关键SQL语句差异与规避方案1. 单元测试中的数据库兼容性挑战在Java开发领域,单元测试是保证代码质量的重要环节。当应用涉及数据库操作时,测试环境的搭建往往成为开发者的痛点。H2数据库因其轻量级、内存模式和快…

2026/7/6 0:01:17 阅读更多 →
Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray 你是否厌倦了Windows任务栏上密密麻麻的图标&…

2026/7/6 0:01:17 阅读更多 →
Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C 运行时库一键安装终极指南:告别DLL缺失烦恼 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过这样的情况:下载了…

2026/7/6 0:05:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻