题目简介:
给定一个二进制字符串 s
和一个正整数 n
,如果对于 [1, n]
范围内的每个整数,其二进制表示都是 s
的 子字符串** ,就返回 true
,否则返回 false
。
子字符串 是字符串中连续的字符序列。
示例 1:
1 | 输入:s = "0110", n = 3 |
提示:
1 <= s.length <= 1000
s[i]
不是'0'
就是'1'
1 <= n <= 10^9
思路:
利用unordered_set
来存储遍历到的数。
当遇到s[i] = 0
时,直接continue
,因为例如s = "0110"
,从s[0]
和s[1]
开始遍历,得到的结果是相同的。
当更新子串[i, j]
的二进制数时,利用x = (x << 1) | (s[j] - '0')
,使其能在O(1)
的时间复杂度内完成。
即将x
整体左移一位,并将最低位设置为s[j]
。
最后判断unordered_set
中的数字数量是否等于n
即可。
代码如下:
1 | class Solution { |