diff --git a/kt/string-compression-iii.kt b/kt/string-compression-iii.kt new file mode 100644 index 0000000..7cdab22 --- /dev/null +++ b/kt/string-compression-iii.kt @@ -0,0 +1,32 @@ +class Solution { + private data class State(val compressed: MutableList>, val count: Int, val character: Char) { + private fun add() { + if (count <= 0) { + return + } + + compressed.add(count to character) + } + + fun update(c: Char): State { + if (c != character || count >= 9) { + add() + return State(compressed, 1, c) + } + + return State(compressed, 1 + count, c) + } + + fun finalize(): State { + add() + return State(compressed, 0, '_') + } + } + + fun compressedString(word: String): String = + word.fold(State(mutableListOf(), 0, word[0])) { acc, it -> + acc.update(it) + }.finalize().compressed.joinToString(separator = "") { + "${it.first}${it.second}" + } +}