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 <= 10001 <= sentence words number <= 10001 <= root length <= 1001 <= sentence words length <= 1000 这题本身就是考察Trie树的,没什么难度。但是写的确实丑陋, 然后参考了其他的代码。有待多加练习 代码: class Solution { class Trie { TrieNode root = new TrieNode(); public void addWord(String word) { TrieNode curNode = root; for(int i=0;i<word.length();i++) { int c = word.charAt(i) - 'a'; if(curNode.next[c] == null) { curNode.next[c] = new TrieNode(); } curNode = curNode.next[c]; } curNode.isWord = true; } // find shortest prefix public String searchPrefix(String word) { TrieNode curNode = root; for(int i=0;i<word.length();i++) { int c = word.charAt(i) - 'a'; if(curNode == null) return word; if(curNode.isWord == true) return word.substring(0, i); curNode = curNode.next[c]; // cat tle } return word; } } class TrieNode { boolean isWord; TrieNode[] next; TrieNode() { next = new TrieNode[26]; } } Trie trie = new Trie(); public String replaceWords(List<String> dict, String sentence) { for(String item: dict) { trie.addWord(item); } String[] str = sentence.split(" "); for(int i = 0;i<str.length;i++){ str[i] = trie.searchPrefix(str[i]); } return String.join(" ",str); } }