热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

LeetCode648.使用Trie树实现单词替换

本问题探讨了如何利用词根(root)概念在英文中构建继承词(successor)。具体来说,通过给定的一系列词根和一个句子,任务是使用词根替换句子中的继承词,以形成一个新的句子。

问题描述

在英语语言学中,存在一个称为词根(root)的概念,它能够与其它词汇组合形成新的、更长的词汇——这类新形成的词汇被定义为继承词(successor)。例如,词根'an'与单词'other'结合,可以生成新词'another'。

本题提供了一个词根列表和一个句子。目标是将句子中所有的继承词替换为其对应的词根。若一个继承词可由多个词根构成,则选择最短的那个词根进行替换。最终需要返回经过替换后的句子。

示例输入: 词根列表 = ["cat", "bat", "rat"]
句子 = "the cattle was rattled by the battery"
期望输出: "the cat was rat by the bat"
限制条件:
输入仅包含小写字母。
词根列表的长度范围为1至1000。
句子中的单词数量不超过1000个。
单个词根的最大长度为100。
句子中单词的最大长度为1000。

Trie树解决方案

此问题可以通过构建Trie树来高效解决。首先,将所有的词根插入到Trie树中;接着,对于句子中的每一个单词,检查其所有可能的前缀是否存在于Trie树中,如果存在,则使用该前缀(即词根)替换原单词。

以下是C++实现代码示例:

class TrieNode {
public:
char value;
bool isWord;
TrieNode* children[26];
TrieNode(char val): value(val), isWord(false) {
memset(children, 0, sizeof(children));
}
};

class Trie {
private:
TrieNode* root;
public:
Trie() { root = new TrieNode('/0'); }
~Trie() { destroy(root); }
void destroy(TrieNode* node) {
for (int i = 0; i <26; ++i) {
if (node->children[i]) destroy(node->children[i]);
}
delete node;
}
void insert(const std::string& word) {
TrieNode* current = root;
for (char c : word) {
if (!current->children[c - 'a']) {
current->children[c - 'a'] = new TrieNode(c);
}
current = current->children[c - 'a'];
}
current->isWord = true;
}
std::string searchPrefix(const std::string& word) {
TrieNode* current = root;
std::string prefix;
for (char c : word) {
if (!current->children[c - 'a']) return "";
current = current->children[c - 'a'];
prefix += c;
if (current->isWord) return prefix;
}
return "";
}
};

class Solution {
public:
std::string replaceWords(std::vector& dictionary, std::string sentence) {
Trie trie;
for (const std::string& root : dictionary) {
trie.insert(root);
}
std::stringstream ss(sentence);
std::string word, result;
while (ss >> word) {
std::string prefix = trie.searchPrefix(word);
result += (prefix.empty() ? word : prefix) + " ";
}
if (!result.empty()) result.pop_back();
return result;
}
};

推荐阅读
  • 本文详细介绍了如何在Java中实现RSA非对称加密技术,包括生成密钥对、加密和解密操作的具体实现步骤。 ... [详细]
  • 本文深入探讨了@RequestBody注解的使用场景及核心逻辑,包括其与@RequestParam的区别和结合使用的方法。文章前半部分介绍了基础知识,后半部分则详细分析了源码和重要结论。 ... [详细]
  • 本文详细探讨了JSP环境下数据库连接的实现方法,包括环境配置、代码示例以及常见的连接问题及其解决方案。 ... [详细]
  • 一、数据更新操作DML语法中主要包括两个内容:查询与更新,更新主要包括:增加数据、修改数据、删除数据。其中这些操作是离不开查询的。1、增加数据语法:INSERTINTO表名称[(字 ... [详细]
  • 统计报表模板及其实现方法
    本文介绍两个实用的统计报表模板,并提供如何将这些静态模板转换为动态JSP页面的方法。同时,文中附上了详细的代码示例。 ... [详细]
  • Vue 中安装 less-loader 时遇到的问题与解决方法
    本文详细探讨了在 Vue 项目中安装 less-loader 遇到的常见问题及其解决策略,旨在帮助开发者有效解决依赖安装失败的情况。 ... [详细]
  • 本文探讨了如何在C#应用程序中有效处理来自两个不同数据库的数据,特别是当需要从一个数据库中选择不在另一个大型集合中的ID时遇到的挑战和解决方案。 ... [详细]
  • Java 动态代理详解与示例
    本文详细介绍了Java中的动态代理机制,包括如何定义接口、实现类和代理处理器,并通过具体示例演示了动态代理的创建和使用过程。 ... [详细]
  • 给定两个整数,分别表示分数的分子和分母,返回该分数的小数形式。如果小数部分是循环的,则将循环部分括在括号内。 ... [详细]
  • 本文详细介绍了C++中常见的容器(如列表、向量、双端队列等)及其迭代器的实现方式,通过具体代码示例展示了如何使用这些容器和迭代器。 ... [详细]
  • 本文介绍了如何使用Python在字符串列表的每个K个字符之后插入指定的值,提供了两种不同的实现方法。 ... [详细]
  • 本人最近在学习python,在看了一些教程后,用python写了一个简单的云音乐播放器,下面把主要代码贴上来,其中用到了gi ... [详细]
  • SQL注入实验:SqliLabs第38至45关解析
    本文深入探讨了SqliLabs项目中的第38至45关,重点讲解了堆叠注入(Stacked Queries)的应用技巧及防御策略。通过实际案例分析,帮助读者理解如何利用和防范此类SQL注入攻击。 ... [详细]
  • 本文探讨了使用Lighttpd与FastCGI实现分布式部署的方法。通过在中心服务器上配置Lighttpd负责请求转发,同时在多个远程服务器上运行FastCGI进程来处理实际业务逻辑,从而提高系统的负载能力和响应速度。 ... [详细]
  • Web安全入门:MySQL基础操作与SQL注入防范
    本文详细介绍了MySQL数据库的基础操作命令,包括数据库和表的基本管理,以及数据的增删查改等常用操作。同时,针对Web安全领域常见的SQL注入问题,提供了初步的理解和防范措施。 ... [详细]
author-avatar
加州旅馆在南京_380
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有