目录链接:
力扣编程题-解法汇总_分享+记录-CSDN博客
GitHub同步刷题项目:
https://github.com/September26/java-algorithms
原题链接:力扣
描述:
给定一个二进制字符串 s
和一个正整数 n
,如果对于 [1, n]
范围内的每个整数,其二进制表示都是 s
的 子字符串 ,就返回 true
,否则返回 false
。
子字符串 是字符串中连续的字符序列。
示例 1:
输入:s = "0110", n = 3 输出:true
示例 2:
输入:s = "0110", n = 4 输出:false
提示:
1 <= s.length <= 1000
s[i]
不是'0'
就是'1'
1 <= n <= 109
解题思路:
* 这题的重点其实有两块: * 1。如果n>2048,是一定会失败的。 * 2。如果[4,7]满足,那么[0,3]一定也是满足的,因为[4,7]去掉第一位的1,就是[0,3]。 * 如果我们要验证9的话,主要验证部分,[4,7][8,9],[4,7]的长度为3,[8,9]的长度为4。 * 所以我们去字符串中所有长度为3和4的,加入到set中,形成所有可能的组合。 * 然后验证4到9对应的字符串在set中是否存在即可。
代码:
public class Solution1016 {
public boolean queryString(String s, int n) {
int oldN = n;
if (!s.contains("1")) {
return false;
}
if (s.equals("1")) {
return true;
}
if (n > (1 << 12)) {
return false;
}
int k = 0;
while (n > 0) {
n = n >> 1;
k++;
}
Set<String> set1 = new HashSet<>();
for (int i = 0; i < s.length() - k + 2; i++) {
set1.add(s.substring(i, i + k - 1));
if (i == s.length() - k + 1) {
break;
}
set1.add(s.substring(i, i + k));
}
int i = 1 << (k - 2);
for (; i <= oldN; i++) {
String string = Integer.toString(i, 2);
if (!set1.contains(string)) {
return false;
}
}
return true;
}
}