• 剑指 Offer II 063. 替换单词


    题目链接

    力扣

    题目描述

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

    解题思路

    前缀树

    代码

    Python

    1. class Trie:
    2. def __init__(self):
    3. self.childs = [None for _ in range(26)]
    4. self.isEnd = False
    5. class Solution:
    6. def findPrefix(self, node: Trie, prefix: str) -> str:
    7. for i in range(len(prefix)):
    8. idx = ord(prefix[i]) - ord('a')
    9. if node.childs[idx]:
    10. if node.childs[idx].isEnd:
    11. return prefix[:i + 1]
    12. else:
    13. return prefix
    14. node = node.childs[idx]
    15. return prefix
    16. def insert(self, node: Trie, word: str) -> None:
    17. for i in range(len(word)):
    18. idx = ord(word[i]) - ord('a')
    19. if not node.childs[idx]:
    20. node.childs[idx] = Trie()
    21. node = node.childs[idx]
    22. node.isEnd = True
    23. def replaceWords(self, dictionary: list[str], sentence: str) -> str:
    24. root = Trie()
    25. for word in dictionary:
    26. self.insert(root, word)
    27. sentenceSplit = str.split(sentence, ' ')
    28. for i in range(len(sentenceSplit)):
    29. sentenceSplit[i] = self.findPrefix(root, sentenceSplit[i])
    30. return ' '.join(sentenceSplit)

    Go

    1. type Trie struct {
    2. childs [26]*Trie
    3. isEnd bool
    4. }
    5. func Constructor() Trie {
    6. return Trie{}
    7. }
    8. func (this *Trie) findPrefix(prefix string) string {
    9. node := this
    10. for i, chr := range prefix {
    11. idx := chr - 'a'
    12. if node.childs[idx] != nil {
    13. if node.childs[idx].isEnd {
    14. return prefix[:i+1]
    15. }
    16. } else {
    17. return prefix
    18. }
    19. node = node.childs[idx]
    20. }
    21. return prefix
    22. }
    23. func (this *Trie) insert(word string) {
    24. node := this
    25. for _, chr := range word {
    26. idx := chr - 'a'
    27. if node.childs[idx] == nil {
    28. node.childs[idx] = &Trie{}
    29. }
    30. node = node.childs[idx]
    31. }
    32. node.isEnd = true
    33. }
    34. func replaceWords(dictionary []string, sentence string) string {
    35. root := Constructor()
    36. for _, word := range dictionary {
    37. root.insert(word)
    38. }
    39. sentenceSplit := strings.Split(sentence, " ")
    40. ans := ""
    41. for _, word := range sentenceSplit {
    42. ans += root.findPrefix(word) + " "
    43. }
    44. return ans[:len(ans)-1]
    45. }

  • 相关阅读:
    【数据结构】Java对象的比较
    探花交友_第6章_完善小视频功能以及即时通讯
    git代码管理工具保姆级教学
    [附源码]SSM计算机毕业设计“云味坊”购物网站JAVA
    MySQL中如何处理并发写入问题?
    概述:穿衣人物的动画重建CVPR2020
    UE5如何实现漫游摄像机跟踪?
    win32&mfc————win32消息机制
    FTP客户端可以发送哪些请求
    springcloud商城源码
  • 原文地址:https://blog.csdn.net/qq_33523932/article/details/125616816