题目简介:
给定一个二进制字符串 s 和一个正整数 n,如果对于 [1, n] 范围内的每个整数,其二进制表示都是 s 的 子字符串** ,就返回 true,否则返回 false 。
子字符串 是字符串中连续的字符序列。
示例 1:
1 | 输入:s = "0110", n = 3 |
提示:
1 <= s.length <= 1000s[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 { |