LeetCode in Kotlin

Hard

Design a special dictionary that searches the words in it by a prefix and a suffix.

Implement the WordFilter class:

Example 1:

Input [“WordFilter”, “f”] [[[“apple”]], [“a”, “e”]]

Output: [null, 0]

Explanation: WordFilter wordFilter = new WordFilter([“apple”]); wordFilter.f(“a”, “e”); // return 0, because the word at index 0 has prefix = “a” and suffix = “e”.

Constraints:

Solution

class WordFilter(words: Array<String>) {
    private class TrieNode {
        var children: Array<TrieNode?> = arrayOfNulls(27)
        var weight: Int = 0
    }

    private val root = TrieNode()

    init {
        for (i in words.indices) {
            val s = words[i]
            for (j in s.indices) {
                insert(s.substring(j) + '{' + s, i)
            }
        }
    }

    private fun insert(wd: String, weight: Int) {
        var node: TrieNode? = root
        for (ch in wd.toCharArray()) {
            if (node!!.children[ch.code - 'a'.code] == null) {
                node.children[ch.code - 'a'.code] = TrieNode()
            }
            node = node.children[ch.code - 'a'.code]
            node!!.weight = weight
        }
    }

    fun f(prefix: String, suffix: String): Int {
        return startsWith("$suffix{$prefix")
    }

    private fun startsWith(pref: String): Int {
        var node: TrieNode? = root
        for (ch in pref.toCharArray()) {
            if (node!!.children[ch.code - 'a'.code] == null) {
                return -1
            }
            node = node.children[ch.code - 'a'.code]
        }
        return node!!.weight
    }
}

/*
 * Your WordFilter object will be instantiated and called as such:
 * var obj = WordFilter(words)
 * var param_1 = obj.f(pref,suff)
 */