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 word successor
. For example, the root an
, followed by other
, which can form another word another
.
Now, given a dictionary consisting of many roots and a sentence. You need to replace all the successor
in the sentence with the root
forming it. If a successor
has many roots
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
题目含义:英文中,以较短的单词为前缀,可以构成较长的单词。此时前缀可以称为“词根”。
给定一组词根字典dict,一个句子sentence。将句中的单词换为字典中出现过的最短词根。
思路:字典树(Trie)。利用词根dict构建字典树trie,遍历sentence中的word,在trie中进行搜索。
1 class Solution { 2 3 class TrieNode { 4 public char val; 5 public boolean isWord; 6 public TrieNode[] children = new TrieNode[26]; 7 public TrieNode() {} 8 TrieNode(char c){ 9 val = c; 10 } 11 } 12 13 public String replaceWords(List<String> dict, String sentence) { 14 String[] tokens = sentence.split(" "); 15 TrieNode trie = buildTrie(dict); 16 return replaceWords(tokens, trie); 17 } 18 19 private String replaceWords(String[] tokens, TrieNode root) { 20 StringBuilder stringBuilder = new StringBuilder(); 21 for (String token : tokens) { 22 stringBuilder.append(getShortestReplacement(token, root)); 23 stringBuilder.append(" "); 24 } 25 return stringBuilder.substring(0, stringBuilder.length()-1); 26 } 27 28 private String getShortestReplacement(String token, final TrieNode root) { 29 TrieNode temp = root; 30 StringBuilder stringBuilder = new StringBuilder(); 31 for (char c : token.toCharArray()) { 32 stringBuilder.append(c); 33 if (temp.children[c - 'a'] != null) { 34 if (temp.children[c - 'a'].isWord) { 35 return stringBuilder.toString(); 36 } 37 temp = temp.children[c - 'a']; 38 } else { 39 return token; 40 } 41 } 42 return token; 43 } 44 45 private TrieNode buildTrie(List<String> dict) { 46 TrieNode root = new TrieNode(' '); 47 for (String word : dict) { 48 TrieNode temp = root; 49 for (char c : word.toCharArray()) { 50 if (temp.children[c - 'a'] == null) { 51 temp.children[c - 'a'] = new TrieNode(c); 52 } 53 temp = temp.children[c - 'a']; 54 } 55 temp.isWord = true; 56 } 57 return root; 58 } 59 }