less than 1 minute read

Problem Statement

leetcode problem link

Brute Force [TLE]

class Solution:
    def longestSubsequence(self, s: str, k: int) -> int:
        N = len(s)
        res = 0
        for i in range(N - 1, -1, -1):
            curr = deque()
            curr.appendleft(s[i])
            for j in range(i - 1, -1, -1):
                curr.appendleft(s[j])
                if int(''.join(curr), 2) <= k:
                    continue
                else:
                    curr.popleft()
            res = max(res, len(curr))
        return res

Improved Algorithm [Accepted]

class Solution:
    def longestSubsequence(self, s: str, k: int) -> int:
        list_chars = list(s)
        removed_indices = set()
        N = len(s)
        res = 0
        for i in range(N):
            temp = []
            for j, x in enumerate(list_chars):
                if j in removed_indices:
                    continue
                temp.append(x)

            if int(''.join(temp), 2) <= k:
                return len(temp)
            else:
                if list_chars[i] == "1":
                    removed_indices.add(i)
        return res

Editorial

Approach: Greedy

class Solution:
    def longestSubsequence(self, s: str, k: int) -> int:
        sm = 0
        cnt = 0
        bits = k.bit_length()
        for i, ch in enumerate(s[::-1]):
            if ch == "1":
                if i < bits and sm + (1 << i) <= k:
                    sm += 1 << i
                    cnt += 1
            else:
                cnt += 1
        return cnt