本文共 3224 字,大约阅读时间需要 10 分钟。
在英语中,我们有一个叫做 词根(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 没有前导或尾随空格。来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/replace-words 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
将词典构建成前缀树/字典树(Trie),树的子节点isEnd表示该节点是否为词根。
然后,将句子sentence切分成单词数组;
最后,遍历单词数组,在词典树中查找词根并替换即可。
class Solution { class TrieNode { public: bool isEnd; unordered_mapnext; TrieNode() { isEnd = false; next.clear(); } }; class Trie { TrieNode * root; public: Trie() { root = new TrieNode(); } void insert(string word) { TrieNode* cur = root; for (char c: word) { if (cur->next.count(c) == 0) { cur->next[c] = new TrieNode(); } cur = cur->next[c]; } cur->isEnd = true; } string search(string word) { string ans; TrieNode* cur = root; for (char c: word) { if (cur->next.count(c) == 0) { return word; } cur = cur->next[c]; ans += c; if (cur->isEnd) { return ans; } } if(cur->isEnd) { return ans; } return word; } };public: string replaceWords(vector & dictionary, string sentence) { Trie * trie = new Trie(); for (auto root: dictionary) { trie->insert(root); } string ans; vector words; int pos = 0; for (int i = 0; i < sentence.length(); i++) { if (sentence[i] == ' ') { words.push_back(sentence.substr(pos, i - pos)); pos = i + 1; } } words.push_back(sentence.substr(pos, sentence.length()-pos + 1)); for (auto word: words) { if(ans.empty()) { ans += trie->search(word); } else { ans += ' '; ans += trie->search(word); } } return ans; }};