Longest Common Suffix Queries

Hard
Watch on YouTube ↗

Solution

class Solution {
    public int[] stringIndices(String[] words, String[] query) {
        Trie trie = new Trie();
        int index = -1, smallest = Integer.MAX_VALUE;

        for (int i = 0; i < words.length; i++) {
            trie.insert(words[i], i);
            if (words[i].length() < smallest) {
                smallest = words[i].length();
                index = i;
            }
        }

        int[] ans = new int[query.length];
        for (int i = 0; i < query.length; i++) {
            int ind = trie.prefix(query[i]);
            ans[i] = (ind == -1) ? index : ind;
        }
        return ans;
    }
}

class TrieNode {
    int index;
    int len;
    TrieNode[] children;

    TrieNode() {
        index = -1;
        len = Integer.MAX_VALUE;
        children = new TrieNode[26];
    }
}

class Trie {
    TrieNode root;

    Trie() {
        root = new TrieNode();
    }

    void insert(String str, int ind) {
        TrieNode node = root;
        int strLen = str.length();

        for (int i = strLen - 1; i >= 0; i--) {         // ← right to left
            int ch = str.charAt(i) - 'a';
            if (node.children[ch] == null)
                node.children[ch] = new TrieNode();
            node = node.children[ch];

            if (strLen < node.len) {
                node.len = strLen;
                node.index = ind;
            }
        }
    }

    int prefix(String query) {
        TrieNode node = root;
        int result = -1;

        for (int i = query.length() - 1; i >= 0; i--) { // ← right to left
            int ch = query.charAt(i) - 'a';
            if (node.children[ch] == null) break;
            node = node.children[ch];
            result = node.index;
        }

        return result;
    }
}