Longest Binary Subsequence Less Than or Equal to K

medium greedy bit manipulation binary string

Problem

Given a binary string s and a positive integer k, return the length of the longest subsequence of s whose binary value is less than or equal to k. The subsequence may contain leading zeroes, and the empty string counts as 0.

Inputs = "1001010", k = 5
Output5
"00010" equals 2 in decimal (≤ 5) and has length 5; no valid subsequence is longer.
Inputs = "00101001", k = 1
Output6
"000001" equals 1 in decimal (≤ 1) and has length 6.

def longest_subsequence(s, k):
    val = 0
    cnt = 0
    for i in range(len(s) - 1, -1, -1):
        if s[i] == '0':
            cnt += 1
        elif cnt < 30 and val + (1 << cnt) <= k:
            val += (1 << cnt)
            cnt += 1
    return cnt
function longestSubsequence(s, k) {
  let val = 0, cnt = 0;
  for (let i = s.length - 1; i >= 0; i--) {
    if (s[i] === '0') {
      cnt++;
    } else if (cnt < 30 && val + (1 << cnt) <= k) {
      val += (1 << cnt);
      cnt++;
    }
  }
  return cnt;
}
int longestSubsequence(String s, int k) {
    long val = 0;
    int cnt = 0;
    for (int i = s.length() - 1; i >= 0; i--) {
        if (s.charAt(i) == '0') {
            cnt++;
        } else if (cnt < 30 && val + (1L << cnt) <= k) {
            val += (1L << cnt);
            cnt++;
        }
    }
    return cnt;
}
int longestSubsequence(string s, int k) {
    long long val = 0;
    int cnt = 0;
    for (int i = (int)s.size() - 1; i >= 0; i--) {
        if (s[i] == '0') {
            cnt++;
        } else if (cnt < 30 && val + (1LL << cnt) <= k) {
            val += (1LL << cnt);
            cnt++;
        }
    }
    return cnt;
}
Time: O(n) Space: O(1)