博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
力扣题解-648. 单词替换
阅读量:4300 次
发布时间:2019-05-27

本文共 3224 字,大约阅读时间需要 10 分钟。

题目:648. 单词替换

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

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

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

示例 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”

示例 3:

输入:dictionary = [“a”, “aa”, “aaa”, “aaaa”], sentence = “a aa a aaaa aaa aaa aaa aaaaaa bbb baba ababa”
输出:“a a a a a a a a bbb baba a”

示例 4:

输入:dictionary = [“catt”,“cat”,“bat”,“rat”], sentence = “the cattle was rattled by the battery”
输出:“the cat was rat by the bat”

示例 5:

输入:dictionary = [“ac”,“ab”], sentence = “it is abnormal that this solution is accepted”
输出:“it is ab that this solution is ac”

提示:

1 <= dictionary.length <= 1000
1 <= dictionary[i].length <= 100
dictionary[i] 仅由小写字母组成。
1 <= sentence.length <= 10^6
sentence 仅由小写字母和空格组成。
sentence 中单词的总量在范围 [1, 1000] 内。
sentence 中每个单词的长度在范围 [1, 1000] 内。
sentence 中单词之间由一个空格隔开。
sentence 没有前导或尾随空格。

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/replace-words
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解

将词典构建成前缀树/字典树(Trie),树的子节点isEnd表示该节点是否为词根。

然后,将句子sentence切分成单词数组;

最后,遍历单词数组,在词典树中查找词根并替换即可。

代码

class Solution {
class TrieNode {
public: bool isEnd; unordered_map
next; TrieNode() {
isEnd = false; next.clear(); } }; class Trie {
TrieNode * root; public: Trie() {
root = new TrieNode(); } void insert(string word) {
TrieNode* cur = root; for (char c: word) {
if (cur->next.count(c) == 0) {
cur->next[c] = new TrieNode(); } cur = cur->next[c]; } cur->isEnd = true; } string search(string word) {
string ans; TrieNode* cur = root; for (char c: word) {
if (cur->next.count(c) == 0) {
return word; } cur = cur->next[c]; ans += c; if (cur->isEnd) {
return ans; } } if(cur->isEnd) {
return ans; } return word; } };public: string replaceWords(vector
& dictionary, string sentence) {
Trie * trie = new Trie(); for (auto root: dictionary) {
trie->insert(root); } string ans; vector
words; int pos = 0; for (int i = 0; i < sentence.length(); i++) {
if (sentence[i] == ' ') {
words.push_back(sentence.substr(pos, i - pos)); pos = i + 1; } } words.push_back(sentence.substr(pos, sentence.length()-pos + 1)); for (auto word: words) {
if(ans.empty()) {
ans += trie->search(word); } else {
ans += ' '; ans += trie->search(word); } } return ans; }};
你可能感兴趣的文章
TB交易开拓者入门教程
查看>>
TB创建公式应用dll失败 请检查用户权限,终极解决方案
查看>>
python绘制k线图(蜡烛图)报错 No module named 'matplotlib.finance
查看>>
talib均线大全
查看>>
期货市场技术分析06_长期图表和商品指数
查看>>
期货市场技术分析07_摆动指数和相反意见理论
查看>>
满屏的指标?删了吧,手把手教你裸 K 交易!
查看>>
不吹不黑 | 聊聊为什么要用99%精度的数据回测
查看>>
X 分钟速成 Python
查看>>
对于模拟交易所引发的思考
查看>>
高频交易的几种策略
查看>>
量化策略回测TRIXKDJ
查看>>
量化策略回测唐安奇通道
查看>>
CTA策略如何过滤部分震荡行情?
查看>>
量化策略回测DualThrust
查看>>
量化策略回测BoolC
查看>>
量化策略回测DCCV2
查看>>
mongodb查询优化
查看>>
五步git操作搞定Github中fork的项目与原作者同步
查看>>
git 删除远程分支
查看>>