LC648 - Replace Words

Description

In English, we have a concept called root, which can be followed by some other word to form another longer word - let’s call this word successor. For example, when the root “an” is followed by the successor word “other”, we can form a new word “another”.
Given a dictionary consisting of many roots and a sentence consisting of words separated by spaces, replace all the successors in the sentence with the root forming it. If a successor can be replaced by more than one root, replace it with the root that has the shortest length.
Return the sentence after the replacement.

Example 1:
Input: dictionary = [“cat”,”bat”,”rat”], sentence = “the cattle was rattled by the battery”
Output: “the cat was rat by the bat”

Example 2:
Input: dictionary = [“a”,”b”,”c”], sentence = “aadsfasf absbs bbab cadsfafs”
Output: “a a b c”

Constraints:
1 <= dictionary.length <= 1000
1 <= dictionary[i].length <= 100
dictionary[i] consists of only lower-case letters.
1 <= sentence.length <= 106
sentence consists of only lower-case letters and spaces.
The number of words in sentence is in the range [1, 1000]
The length of each word in sentence is in the range [1, 1000]
Every two consecutive words in sentence will be separated by exactly one space.
sentence does not have leading or trailing spaces.

Solution

  1. Put all the words in the dictionary into the hash set (word in dictionary is faster in the hash set, if it is a list, it will require O(n) complexity)
  2. Split the sentence into several words according to spaces
  3. Traverse each word, if the current word appears in the hash set, replace the word and break the loop
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# O(n^2) time | O(n) space
class Solution:
def replaceWords(self, dictionary: List[str], sentence: str) -> str:
words = sentence.split()
dictionary = set(dictionary)
for w in range(len(words)):
for i in range(len(words[w])):
if words[w][:i] in dictionary:
words[w] = words[w][:i]
break
return ' '.join(words)

#Runtime: 206 ms, faster than 52.69% of Python3 online submissions for Replace Words.
#Memory Usage: 18.3 MB, less than 98.64% of Python3 online submissions for Replace Words.

To-do: Trie