2311. 小于等于 K 的最长二进制子序列— day98
前言:
作者:神的孩子在歌唱
一个算法小菜鸡
大家好,我叫智
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();// 循环补充0pre = pre -1;while(pre >= 0) {if(s.charAt(pre) == '0') {count++;} pre--;}num = count;break;} }return num;}
}
本人csdn博客:https://blog.csdn.net/weixin_46654114
转载说明:跟我说明,务必注明来源,附带本人博客连接。