diff --git a/kotlin/2707-extra-characters-in-a-string.kt b/kotlin/2707-extra-characters-in-a-string.kt new file mode 100644 index 000000000..f36317f44 --- /dev/null +++ b/kotlin/2707-extra-characters-in-a-string.kt @@ -0,0 +1,47 @@ +class Solution { + + private lateinit var memo: IntArray + + private class TrieNode { + val children = HashMap() + var isWord = false + } + + fun minExtraChar(s: String, dictionary: Array): Int { + val root = buildTrie(dictionary) + memo = IntArray(s.length) { -1 } + return dfs(0, s, root) + } + + private fun dfs(index: Int, s: String, root: TrieNode): Int { + if (index == s.length) return 0 + if (memo[index] != -1) return memo[index] + + var result = 1 + dfs(index + 1, s, root) + + var node = root + for (i in index until s.length) { + node = node.children[s[i]] ?: break + if (node.isWord) { + result = minOf(result, dfs(i + 1, s, root)) + } + } + + memo[index] = result + return result + } + + private fun buildTrie(dictionary: Array): TrieNode { + val root = TrieNode() + + for (word in dictionary) { + var node = root + for (ch in word) { + node = node.children.getOrPut(ch) { TrieNode() } + } + node.isWord = true + } + + return root + } +}