648. 单词替换
难度中等
在英语中,我们有一个叫做 词根(root)的概念,它可以跟着其他一些词组成另一个较长的单词——我们称这个词为 继承词(successor)。例如,词根an,跟随着单词 other(其他),可以形成新的单词 another(另一个)。
现在,给定一个由许多词根组成的词典和一个句子。你需要将句子中的所有继承词用词根替换掉。如果继承词有许多可以形成它的词根,则用最短的词根替换它。
你需要输出替换之后的句子。
示例 1:
输入: 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
用最笨的方法居然也给过了!!!
class Solution(object):
def replaceWords(self, dict, sentence):
"""
:type dict: List[str]
:type sentence: str
:rtype: str
"""
trie = Trie()
for w in dict:
trie.add_word(w)
words = sentence.split()
return " ".join([trie.find_neareast(word) for word in words])
"""
dict2 = {w for w in dict}
words = sentence.split()
return " ".join([self.replace(word, dict2) for word in words])
"""
def replace(self, word, dict2):
for i in range(1, len(word)+1):
if word[:i] in dict2:
return word[:i]
return word
class Node(object):
def __init__(self, char="", word=""):
self.char = char
self.word = word
self.children = {}
class Trie(object):
def __init__(self):
self.root = Node()
def add_word(self, word):
cur = self.root
for w in word:
if w not in cur.children:
cur.children[w] = Node(w)
cur = cur.children[w]
cur.word= word
def find_neareast(self, word):
cur = self.root
for w in word:
if cur.word:
return cur.word
if w not in cur.children:
return word
cur = cur.children[w]
return word