「每日LeetCode」2022年7月7日

本文最后更新于:2023年3月19日 晚上

648.单词替换

648.单词替换

Category Difficulty Likes Dislikes
algorithms Medium (59.94%) 204 -

Tags
Companies
在英语中,我们有一个叫做 词根(root) 的概念,可以词根后面添加其他一些词组成另一个较长的单词——我们称这个词为 继承词(successor)。例如,词根 an,跟随着单词 other(其他),可以形成新的单词 another(另一个)。
现在,给定一个由许多词根组成的词典 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”

提示:

  • 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 没有前导或尾随空格。

Discussion | Solution

思路

遍历字典数组,构建一个字典树,并在每个字典词语结束位置打标。遍历每个句子的每个单词,将每个单词每个字符在字典树中进行匹配,找到第一个打标的位置得到对应的词进行替换。

解答

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
/*
* @lc app=leetcode.cn id=648 lang=javascript
*
* [648] 单词替换
*/

// @lc code=start
/**
* @param {string[]} dictionary
* @param {string} sentence
* @return {string}
*/
var replaceWords = function (dictionary, sentence) {
const map = {
child: {},
};

for (const item of dictionary) {
let cur = map;
for (let i = 0; i < item.length; i++) {
const char = item[i];
if (!cur.child[char]) {
cur.child[char] = {
child: {},
};
}

if (i === item.length - 1) {
cur.child[char].end = item;
}

cur = cur.child[char];
}
}

sentence = sentence.split(" ");

for (let i = 0; i < sentence.length; i++) {
const word = sentence[i];
let cur = map;
for (let j = 0; j < word.length; j++) {
const char = word[j];
if (!cur.child[char]) break;
if (cur.child[char].end) {
sentence.splice(i, 1, cur.child[char].end);
break;
}
cur = cur.child[char];
}
}
return sentence.join(" ");
};
// @lc code=end