2311. 小于等于 K 的最长二进制子序列— day98

前言:

作者:神的孩子在歌唱

一个算法小菜鸡

大家好,我叫智

image-20250628221138026

2311. 小于等于 K 的最长二进制子序列

给你一个二进制字符串 s 和一个正整数 k

请你返回 s最长 子序列的长度,且该子序列对应的 二进制 数字小于等于 k

注意:

  • 子序列可以有 前导 0
  • 空字符串视为 0
  • 子序列 是指从一个字符串中删除零个或者多个字符后,不改变顺序得到的剩余字符序列。

示例 1:

输入:s = "1001010", k = 5
输出:5
解释:s 中小于等于 5 的最长子序列是 "00010" ,对应的十进制数字是 2 。
注意 "00100" 和 "00101" 也是可行的最长子序列,十进制分别对应 4 和 5 。
最长子序列的长度为 5 ,所以返回 5 。

示例 2:

输入:s = "00101001", k = 1
输出:6
解释:"000001" 是 s 中小于等于 1 的最长子序列,对应的十进制数字是 1 。
最长子序列的长度为 6 ,所以返回 6 。

提示:

  • 1 <= s.length <= 1000
  • s[i] 要么是 '0' ,要么是 '1'
  • 1 <= k <= 109

思路: 计算k的二进制,然后从后往前循环对比,满足条件后在补充0

class Solution {
    public int longestSubsequence(String s, int k) {
        String binaryString = Integer.toBinaryString(k);
        int num = binaryString.length() -1;
        // 总的二进制长度小于肯定也会小于k,返回s的长度就可以
        if(s.length() < binaryString.length()) {
            return s.length();
        }
        for(int i = s.length(); i >= binaryString.length(); i--) {
            int count = 0;
            int pre = i - binaryString.length();
            String sub = s.substring(pre, i);

            int sum = Integer.parseInt(sub, 2);
            // 如果小于说明满足条件
            if(sum <= k ) {
                count = sub.length();
                // 循环补充0
                pre = pre -1;
                while(pre >= 0) {
                    if(s.charAt(pre) == '0') {
                        count++;
                    } 
                    pre--;
                }
                num = count;
                break;

            } 
           
        }
        return num;
    }
}

本人csdn博客:https://blog.csdn.net/weixin_46654114

转载说明:跟我说明,务必注明来源,附带本人博客连接。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

神的孩子都在歌唱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值