0%

『LeetCode』648 单词替换

题目

648. 单词替换

在英语中,我们有一个叫做 词根(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 没有前导或尾随空格。

标签

字典树, 数组, 哈希表, 字符串

相似题目


题解

【单词替换】模拟&前缀树

模拟

将句子拆分成单词然后逐单词遍历字典寻找匹配项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# Code language: Python
class Solution:
def replaceWords(self, dictionary: List[str], sentence: str) -> str:
s = list()
for word in sentence.split():
match = None
for d in dictionary:
if word.startswith(d):
if match is None or len(match) > len(d):
match = d
if match is None:
s.append(word)
else:
s.append(match)
return " ".join(s)
  • 时间复杂度: \(O(nm)\), \(n, m\) 分别是句子中单词数量和词典中词根数量
  • 空间复杂度: \(O(n)\)

前缀树

前缀树可以参考相似题目:实现 Trie (前缀树) (中等)

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
# Code language: Python
class TrieNode:
def __init__(self):
self.end = False
self.next = defaultdict(TrieNode)

class Trie:
def __init__(self, dictionary):
self.root = TrieNode()
for s in dictionary:
self.add(s)

def add(self, s):
cur = self.root
for c in s:
cur = cur.next[c]
cur.end = True

def search(self, s):
cur = self.root
for idx, c in enumerate(s):
if cur.end:
return s[:idx]
if c not in cur.next:
return s
cur = cur.next[c]
return s

class Solution:
def replaceWords(self, dictionary: List[str], sentence: str) -> str:
tr = Trie(dictionary)
return " ".join(tr.search(word) for word in sentence.split())
  • 时间复杂度: \(O(n + m)\), \(n, m\) 分别是句子中单词数量和词典中词根数量
  • 空间复杂度: \(O(n + m)\)

如果对你有帮助的话,请给我点个赞吧~

欢迎前往 我的博客Algorithm - Github 查看更多题解

--- ♥ end ♥ ---

欢迎关注我呀~