diff --git a/java/replace-words.java b/java/replace-words.java new file mode 100644 index 0000000..e8bf7b3 --- /dev/null +++ b/java/replace-words.java @@ -0,0 +1,78 @@ +import java.util.List; + +class Solution { + private class Trie { + public Trie() { + root = new TrieNode(); + } + + public void insert(String word) { + root.insert(word); + } + + public String shortestPrefix(String word) { + return root.shortestPrefix(word); + } + + private TrieNode root; + + private class TrieNode { + boolean has; + TrieNode[] successors; + + TrieNode() { + has = false; + successors = new TrieNode[26]; + } + + void insert(String word) { + TrieNode node = this; + + for (int i = 0; i < word.length(); ++i) { + int idx = word.charAt(i) - 'a'; + + if (node.successors[idx] == null) { + node.successors[idx] = new TrieNode(); + } + node = node.successors[idx]; + } + + node.has = true; + } + + String shortestPrefix(String word) { + TrieNode node = this; + + for (int i = 0; i < word.length(); ++i) { + int idx = word.charAt(i) - 'a'; + + if (node.successors[idx] == null) { + return word; + } + + node = node.successors[idx]; + if (node.has) { + return word.substring(0, i + 1); + } + } + + return word; + } + } + } + + public String replaceWords(List dictionary, String sentence) { + String words[] = sentence.split(" "); + + var t = new Trie(); + for (var word : dictionary) { + t.insert(word); + } + + for (int i = 0; i < words.length; ++i) { + words[i] = t.shortestPrefix(words[i]); + } + + return String.join(" ", words); + } +}