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
这题本身就是考察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);
}
}