题目链接
思路
- 主要思路就是根据词根构建一个前缀树,然后我们在前缀树中搜索每个单词,如果其中的某一步发现isWord是true,那就用现在为止的前缀树中的单词替换原先的单词
class Trie {
class TrieNode {
boolean isWord;
TrieNode[] children;
TrieNode() {
children = new TrieNode[26];
}
}
TrieNode root;
Trie() {
root = new TrieNode();
}
void add(String s) {
TrieNode cur = root;
for (char ch : s.toCharArray()) {
if (null == cur.children[ch - 'a'])
cur.children[ch - 'a'] = new TrieNode();
cur = cur.children[ch - 'a'];
}
cur.isWord = true;
}
String getRoot(String s) {
TrieNode cur = root;
StringBuilder word = new StringBuilder();
for (char ch : s.toCharArray()) {
if (cur.isWord)
return word.toString();
if (null == cur.children[ch - 'a'])
return s;
cur = cur.children[ch - 'a'];
word.append(ch);
}
return s;
}
}
class Solution {
public String replaceWords(List<String> dictionary, String sentence) {
Trie trie = new Trie();
dictionary.forEach(trie::add);
String[] words = sentence.split(" ");
for (int i = 0; i < words.length; i++) {
words[i] = trie.getRoot(words[i]);
}
return String.join(" ", words);
}
}