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

解题分析及思路:

本题本身没有什么难度,数据量又少,几乎可以不考虑时间以及空间上的事情。

唯一需要注意的是怎么在一个单词中(例如another)找出它的最短词根(例如an),可以考虑使用strings工具包中的strings.HasPrefix方法进行判断。

找到最短词根:那么,我们直接遍历sentence分割后的字符数组,判断dictionary是否含有词根,再将其与临时变量比较长度,如果长度小于临时变量,即替换临时变量,这样就可以找到最短词根了。

优化:为了减少判断次数,可以事先将dictionary进行排序,可以使用sort.Slice方法对dictionary根据长度进行排序。这样,在判断是否含有词根时,如果找到了,直接停止比较。

代码分析:

分割sentence

words := strings.Split(sentence, " ")

dictionary按照长度进行排序,短的排前面

sort.Slice(dictionary, func(i, j int) bool {
    return len(dictionary[i]) < len(dictionary[j])
})

遍历、比较以及保存最后结果

var res []string
for index := range words {
    var temp string
    for dIndex := range dictionary {
        if strings.HasPrefix(words[index], dictionary[dIndex]) {
            temp = dictionary[dIndex]
            break
        }
    }
    if temp == "" {
        res = append(res, words[index])
    } else {
        res = append(res, temp)
    }
}

复杂度:

  • 时间复杂度:O(d * s),d为dictionary的长度,s为sentence的字符数
  • 空间复杂度:O(s),s为sentence的字符数

执行结果:

  • 执行用时: 8 ms , 在所有 Go 提交中击败了 100.00% 的用户
  • 内存消耗: 8.4 MB , 在所有 Go 提交中击败了 84.68% 的用户
Tags :

通过次数 82.7K 提交次数 130K 通过率 63.7%

Related Posts

1026. 节点与其祖先之间的最大差值

## 题目描述:给定二叉树的根节点 root,找出存在于 不同 节点 A 和 B 之间的最大值 V,其中 V = |A.val - B.val|,且 A 是 B 的祖先。(如果 A 的任何子节点之一为 B,或者 A 的任何子节点是 B 的祖先,那么我们认为 A 是 B 的祖先)示例 1: ![](/img/leetcode/1026节点与其祖先之间的最大差值/tmp-tre

read more

1038. 从二叉搜索树到更大和树

## 题目描述:给定一个二叉搜索树 root (BST),请将它的每个节点的值替换成树中大于或者等于该节点值的所有节点值之和。提醒一下, 二叉搜索树 满足下列约束条件:- 节点的左子树仅包含键 小于 节点键的节点。 - 节点的右子树仅包含键 大于 节点键的节点。 - 左右子树也必须是二叉搜索树。*示例 1:***![](/img/leetcode/

read more

105. 从前序与中序遍历序列构造二叉树

## 题目描述:给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。示例 1: ``` 输入: preorder = [3,9,20,15,7], inorder = [

read more

106. 从中序与后序遍历序列构造二叉树

## 题目描述:给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。示例 1: ``` 输入:inorder = [9,3,15,20,7], postorder

read more

109. 有序链表转换二叉搜索树

## 题目描述:给定一个单链表的头节点 head ,其中的元素 按升序排序 ,将其转换为高度平衡的二叉搜索树。本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差不超过 1。示例 1: ``` 输入: head = [-10,-3,0,5,9] 输出: [0,-3,9

read more

114. 二叉树展开为链表

## 题目描述:给你二叉树的根结点 root ,请你将它展开为一个单链表:- 展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。 - 展开后的单链表应该与二叉树 先序遍历 顺序相同。示例 1: ``` 输入:root

read more