LeetCode in Kotlin

1849. Splitting a String Into Descending Consecutive Values

Medium

You are given a string s that consists of only digits.

Check if we can split s into two or more non-empty substrings such that the numerical values of the substrings are in descending order and the difference between numerical values of every two adjacent substrings is equal to 1.

Return true if it is possible to split s as described above__, or false otherwise.

A substring is a contiguous sequence of characters in a string.

Example 1:

Input: s = “1234”

Output: false

Explanation: There is no valid way to split s.

Example 2:

Input: s = “050043”

Output: true

Explanation: s can be split into [“05”, “004”, “3”] with numerical values [5,4,3]. The values are in descending order with adjacent values differing by 1.

Example 3:

Input: s = “9080701”

Output: false

Explanation: There is no valid way to split s.

Constraints:

Solution

class Solution {
    fun splitString(s: String): Boolean {
        return solve(0, -1, s, 0)
    }

    private fun solve(i: Int, prev: Long, s: String, k: Int): Boolean {
        if (i == s.length) {
            return k >= 2
        }
        var cur: Long = 0
        for (j in i until s.length) {
            cur = cur * 10 + s[j].code.toLong() - '0'.code.toLong()
            if ((prev == -1L || prev - cur == 1L) && solve(j + 1, cur, s, k + 1)) {
                return true
            }
        }
        return false
    }
}