package com.fishercoder.solutions;

import java.util.List;

/**
 * 648. Replace Words

 * 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

 */
public class _648 {
    public static class Solution1 {
        public String replaceWords(List<String> dict, String sentence) {
            String[] tokens = sentence.split(" ");
            TrieNode trie = buildTrie(dict);
            return replaceWords(tokens, trie);
        }

        private String replaceWords(String[] tokens, TrieNode root) {
            StringBuilder stringBuilder = new StringBuilder();
            for (String token : tokens) {
                stringBuilder.append(getShortestReplacement(token, root));
                stringBuilder.append(" ");
            }
            return stringBuilder.substring(0, stringBuilder.length() - 1);
        }

        private String getShortestReplacement(String token, final TrieNode root) {
            TrieNode temp = root;
            StringBuilder stringBuilder = new StringBuilder();
            for (char c : token.toCharArray()) {
                stringBuilder.append(c);
                if (temp.children[c - 'a'] != null) {
                    if (temp.children[c - 'a'].isWord) {
                        return stringBuilder.toString();
                    }
                    temp = temp.children[c - 'a'];
                } else {
                    return token;
                }
            }
            return token;
        }

        private TrieNode buildTrie(List<String> dict) {
            TrieNode root = new TrieNode(' ');
            for (String word : dict) {
                TrieNode temp = root;
                for (char c : word.toCharArray()) {
                    if (temp.children[c - 'a'] == null) {
                        temp.children[c - 'a'] = new TrieNode(c);
                    }
                    temp = temp.children[c - 'a'];
                }
                temp.isWord = true;
            }
            return root;
        }

        public class TrieNode {
            char val;
            TrieNode[] children;
            boolean isWord;

            public TrieNode(char val) {
                this.val = val;
                this.children = new TrieNode[26];
                this.isWord = false;
            }
        }
    }
}

@@ -57,909 +57,8 @@
 t;%0A%0A
-/**%0A * 648. Replace Words%0A%0A * In English, we have a concept called root,%0A * which can be followed by some other words to form another longer word%0A * - let's call this word successor.%0A * For example, the root an, followed by other, which can form another word another.%0A * Now, given a dictionary consisting of many roots and a sentence.%0A * You need to replace all the successor in the sentence with the root forming it.%0A * If a successor has many roots can form it, replace it with the root with the shortest length.%0A%0A You need to output the sentence after the replacement.%0A%0A Example 1:%0A Input: dict = %5B%22cat%22, %22bat%22, %22rat%22%5D%0A sentence = %22the cattle was rattled by the battery%22%0A Output: %22the cat was rat by the bat%22%0A%0A Note:%0A The input will only have lower-case letters.%0A 1 %3C= dict words number %3C= 1000%0A 1 %3C= sentence words number %3C= 1000%0A 1 %3C= root length %3C= 100%0A 1 %3C= sentence words length %3C= 1000%0A%0A */%0A
 publ

refactor 648