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:
0
.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:
1 <= s.length <= 1000
s[i]
is either '0'
or '1'
.1 <= k <= 109
@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
}
}