Geek

博客园 首页 新随笔 联系 订阅 管理

剑指 Offer II 063. 替换单词

Difficulty: **在英语中,有一个叫做 词根(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 没有前导或尾随空格。   注意:本题与主站 648 题相同: https://leetcode-cn.com/problems/replace-words/ **

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

注意:本题与主站 648 题相同:

Solution

Language: ****

type Node struct {
    child [26]*Node 
    isWord bool
}

func New() *Node {
    return &Node {
        child: [26]*Node{},
        isWord: false,
    }
}

func (node *Node) Insert(word string) {
    var cur = node 
    for _,c := range word  {
        if cur.child[c-'a'] == nil {
            cur.child[c-'a'] = New()
        }
        cur =  cur.child[c-'a' ]
    }
    cur.isWord= true
}
func (node *Node ) GetPrefix(word string) string {
    var cur = node 
    var res strings.Builder
    for _,c := range word {
        var i = c-'a'
        if cur.child[i] == nil {
            return word
        }
        res.WriteRune(c)
        cur = cur.child[i]
        if cur.isWord {
            return res.String()
        }

    }
    return word
}





func replaceWords(dictionary []string, sentence string) string {
    var root = New()
    for _, w := range dictionary {
        root.Insert(w)
    }
    var result = strings.Fields(sentence)
    for i:=0;i<len(result) ; i++ {
        result[i] = root.GetPrefix(result[i])
    } 
    return strings.Join(result," ")



}
​
posted on 2021-11-29 15:54  .geek  阅读(75)  评论(0编辑  收藏  举报