1. 题目

在英语中,我们有一个叫做 词根(root)的概念,它可以跟着其他一些词组成另一个较长的单词——我们称这个词为 继承词(successor)。例如,词根an,跟随着单词 other(其他),可以形成新的单词 another(另一个)。

现在,给定一个由许多词根组成的词典和一个句子。你需要将句子中的所有继承词用词根替换掉。如果继承词有许多可以形成它的词根,则用最短的词根替换它。

你需要输出替换之后的句子。

输入: dict(词典) = ["cat", "bat", "rat"]
sentence(句子) = "the cattle was rattled by the battery"
输出: "the cat was rat by the bat"注:
输入只包含小写字母。
1 <= 字典单词数 <=1000
1 <=  句中词语数 <= 1000
1 <= 词根长度 <= 100
1 <= 句中词语长度 <= 1000

2. Trie解题

参考:Trie树

  • 先将单词插入Trie树
  • 然后依次查询每个单词的各前缀是否在Trie中,进行替换
class TrieNode//节点
{public:char ch;TrieNode *next[26];bool isEnd;TrieNode(char c = '/'):ch(c),isEnd(false) {memset(next, 0, sizeof(TrieNode*)*26);}
};
class Trie//Trie树
{public:TrieNode *root;Trie(){root = new TrieNode();}~Trie()//析构释放内存{destroy(root);}void destroy(TrieNode *root){if(root == NULL)return;for(int i = 0; i < 26; i++)destroy(root->next[i]);delete root;}void insert(string str)//插入单词{TrieNode *cur = root;for(char s:str){if(cur->next[s-'a'] == NULL)cur->next[s-'a'] = new TrieNode(s-'a');cur = cur->next[s-'a'];}cur->isEnd = true;}
};
class Solution {Trie tree;
public:string replaceWords(vector<string>& dict, string sentence) {for(string s:dict)tree.insert(s);string word, ans, prefix;TrieNode *cur = tree.root;istringstream in(sentence);int i, chIdx;while(in >> word){cur = tree.root;prefix = "";for(i = 0; i < word.size(); ++i){chIdx = word[i]-'a';if(cur->next[chIdx] == NULL){ans += word;break;}else{prefix.push_back(word[i]);if(cur->next[chIdx]->isEnd){ans += prefix;break;}if(i == word.size()-1)//最后一个字符特殊处理ans += prefix;}cur = cur->next[chIdx];}ans.push_back(' ');}ans.pop_back();//删除空格return ans;}
};

LeetCode 648. 单词替换(Trie树)相关推荐

  1. LeetCode 648. 单词替换

    文章目录 一.题目 1.题目描述 2.基础框架 3.原题链接 二.解题报告 1.思路分析 2.时间复杂度 3.代码详解 三.本题小知识 四.加群须知 一.题目 1.题目描述   在英语中,我们有一个叫 ...

  2. Leetcode 648.单词替换(Replace Words)

    Leetcode 648.单词替换 1 题目描述(Leetcode题目链接)   在英语中,我们有一个叫做 词根(root)的概念,它可以跟着其他一些词组成另一个较长的单词--我们称这个词为 继承词( ...

  3. 648. 单词替换 : 字典树的经典运用

    题目描述 这是 LeetCode 上的 648. 单词替换 ,难度为 中等. Tag : 「字典树」 在英语中,我们有一个叫做 词根(root) 的概念,可以词根后面添加其他一些词组成另一个较长的单词 ...

  4. Leetcode 648.单词替换

    单词替换 在英语中,我们有一个叫做 词根(root)的概念,它可以跟着其他一些词组成另一个较长的单词--我们称这个词为 继承词(successor).例如,词根an,跟随着单词 other(其他),可 ...

  5. 每日一题·648.单词替换·前缀树

    题目 示例 思路 前缀:字符串的前缀是指字符串的任意首部.比如字符串"abbc"的前缀有"a","ab","abb",& ...

  6. 2022-1-29 Leetcode 648.单词替换

    这道题目的关键是,如果找到了前缀,就整个单词就只留下前缀,剩下的部分扔掉,如果没有找到前缀,整个单词都留下. string replaceWords(vector<string>& ...

  7. 字典树/Trie/前缀树-LeetCode总结:720词典中最长的单词;127. 单词接龙;677. 键值映射;面试题 17.17. 多次搜索;648. 单词替换

    MyTrie结构体和相关操作函数 typedef struct MyTrie {bool is_word;vector<MyTrie*> next;MyTrie():is_word(fal ...

  8. leetcode每日一题--前缀树;前缀哈希;深搜;面试题 08.04. 幂集;648. 单词替换面试题 01.09. 字符串轮转;剑指 Offer II 062. 实现前缀树

    leetcode每日一题 ps:今天的每日一题没意思,简单的模拟,自己换一道 面试题 08.04. 幂集 幂集.编写一种方法,返回某集合的所有子集.集合中不包含重复的元素. 说明:解集不能包含重复的子 ...

  9. LeetCode 758. 字符串中的加粗单词(Trie树)

    文章目录 1. 题目 2. 解题 1. 题目 给定一个关键词集合 words 和一个字符串 S,将所有 S 中出现的关键词加粗.所有在标签 <b> 和 </b> 中的字母都会加 ...

最新文章

  1. python conrurrent
  2. python程序员一天写多少行代码-这个工具,30分钟居然把我一天的工作给干完了!...
  3. MyEclipse显示 Install new software 在线安装插件选项
  4. ESP8266的MQTT客户端搭建教程(基于NONS_SDK_v2.0)
  5. 数据库菜鸟不可不看 简单SQL语句小结
  6. 联合利华搭上阿里云数据中台 精准营销新客提升2倍
  7. 全国计算机等级考试题库二级C操作题100套(第67套)
  8. php 汉字分割,php支持中文字符串分割的函数
  9. Venn网络展示富集分析结果
  10. staruml java_非常详细的StarUML使用教程,推荐阅读!
  11. putty连上l虚拟机中的linux要点
  12. r 语言 ggplot上添加平均值_技术贴 | R语言:ggplot堆叠图、冲积图、分组分面、面积图...
  13. Photoshop (PS)下载安装
  14. 招商银行笔试题之修塔游戏
  15. Zookeeper特点及理解
  16. php 对象教程,创建一个简单的PHP对象_PHP教程
  17. CSR867x 之充电配置开发
  18. 高精地图_语义地图_众包地图相关论文笔记
  19. 成都天府七中智慧校园蓝牙网关部署方案
  20. 华为WLAN(AC+AP)的简单配置

热门文章

  1. 计算机等级考试2010,2010年全国计算机等级考试相关政策
  2. 《跟我一起写Makefile》读书笔记(2)
  3. python 分布图_python数据分布型图表柱形分布图系列带误差线的柱形图
  4. inputstream的大小为0_刘科排列三第2020306期推荐:独胆参考0,双胆0和7
  5. SPOJ GSS2 Can you answer these queries II (线段树离线) - xgtao -
  6. [objective-c] 08 - 内存管理
  7. ubuntu安装操作HttpSQS高速队列
  8. CMD 命令行查看端口被哪个程序占用,并根据PID值,找到相应的程序,关闭掉对应服务或进程!...
  9. 字节取消大小周,部分员工:心疼,每个月少拿 1W 块
  10. Linux 僵尸进程可以被杀死吗?