前言:
作者:神的孩子在歌唱
一个算法小菜鸡
大家好,我叫智
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
转载说明:跟我说明,务必注明来源,附带本人博客连接。