Problem statement
In English, we have a concept called
root
, which can be followed by some other words to form another longer word - let's call this wordsuccessor
. For example, the rootan
, followed byother
, which can form another wordanother
.Now, given a dictionary consisting of many roots and a sentence. You need to replace all the
successor
in the sentence with theroot
forming it. If asuccessor
has manyroots
can form it, replace it with the root with the shortest length.You need to output the sentence after the replacement.
Example 1:
Input: dict = ["cat", "bat", "rat"] sentence = "the cattle was rattled by the battery" Output: "the cat was rat by the bat"Note:
- The input will only have lower-case letters.
- 1 <= dict words number <= 1000
- 1 <= sentence words number <= 1000
- 1 <= root length <= 100
- 1 <= sentence words length <= 1000
Solution
Although this is the fourth problem of leetcode weekly contest 42, the solution is pretty straightforward.
The best solution should employ the trie tree, by now, I have no idea of that. Alternatively, I add all root words into a hash table and search by the key value.
The general idea:
- Add all roots into hash table.
- Separate the strings into single word.
- Search from the start of each word to find if root exists in hash table.
Time complexity is O(n), n is the size of setence, space complexity is O(n + m), m is the size of root.
class Solution { public: string replaceWords(vector<string>& dict, string sentence) { // add the dict into a set to search set<string> ht; for(auto dic : dict){ ht.insert(dic); } // partition the sentences into words vector<string> words; for(int i = 0, j = 0; i < sentence.size() && j <= sentence.size(); j++){ if(sentence[j] == ' ' || j == sentence.size()){ words.push_back(sentence.substr(i, j - i)); i = j + 1; } } // find root in dictionary for(int i = 0; i < words.size(); i++){ for(int j = 0; j < words[i].size(); j++){ if(ht.find(words[i].substr(0, j + 1)) != ht.end()){ words[i] = words[i].substr(0, j + 1); break; } } } // build the whole sentence string ans = words[0]; for(int i = 1; i < words.size(); i++){ ans += " " + words[i]; } return ans; } };