LeetCode in Kotlin

2311. Longest Binary Subsequence Less Than or Equal to K

Medium

You are given a binary string s and a positive integer k.

Return the length of the longest subsequence of s that makes up a binary number less than or equal to k.

Note:

Example 1:

Input: s = “1001010”, k = 5

Output: 5

Explanation: The longest subsequence of s that makes up a binary number less than or equal to 5 is “00010”, as this number is equal to 2 in decimal.

Note that “00100” and “00101” are also possible, which are equal to 4 and 5 in decimal, respectively.

The length of this subsequence is 5, so 5 is returned.

Example 2:

Input: s = “00101001”, k = 1

Output: 6

Explanation: “000001” is the longest subsequence of s that makes up a binary number less than or equal to 1, as this number is equal to 1 in decimal.

The length of this subsequence is 6, so 6 is returned.

Constraints:

Solution

@Suppress("NAME_SHADOWING")
class Solution {
    fun longestSubsequence(s: String, k: Int): Int {
        var k = k
        var res = 0
        var cost = 1
        val n = s.length
        for (i in n - 1 downTo 0) {
            if (s[i] == '0' || cost <= k) {
                k -= cost * (s[i].code - '0'.code)
                ++res
            }
            if (cost <= k) {
                cost *= 2
            }
        }
        return res
    }
}