Leetcode.1016 子串能表示从 1 到 N 数字的二进制串

题目链接

Leetcode.1016 子串能表示从 1 到 N 数字的二进制串 Rating : 1779

题目描述

给定一个二进制字符串 s 和一个正整数 n,如果对于 [ 1 , n ] [1, n] [1,n] 范围内的每个整数,其二进制表示都是 s子字符串 ,就返回 true,否则返回 false

子字符串 是字符串中连续的字符序列。

示例 1:

输入:s = “0110”, n = 3
输出:true

示例 2:

输入:s = “0110”, n = 4
输出:false

提示:
  • 1 < = s . l e n g t h < = 1000 1 <= s.length <= 1000 1<=s.length<=1000
  • s [ i ] s[i] s[i] 不是 ‘0’ 就是 ‘1’
  • 1 < = n < = 1 0 9 1 <= n <= 10^9 1<=n<=109

解法:位运算 & 哈希表

因为 n n n 的最大值为 1 0 9 10^9 109用二进制表示的话最多需要 30 30 30 位 二进制数

我们只需要用一个哈希表 u s e t uset uset 记录从 s [ i ] s[i] s[i] 开始( s [ i ] ≠ ′ 0 ′ s[i] \neq '0' s[i]=0) 到 s [ j ] s[j] s[j] 对应的二进制数,规定 s [ i . . j ] s[i..j] s[i..j] 这一子串所表示的数 ≤ n \leq n n

最后判断 u s e t . s i z e ( ) uset.size() uset.size() 是否等于 n n n 即可。

时间复杂度: O ( m × l o g n ) O(m \times logn) O(m×logn)

C++代码:

class Solution {
public:
    bool queryString(string s, int n) {
        int m = s.size();
        unordered_set<int> uset;

        for(int i = 0;i < m;i++){
            int x = s[i] - '0';
            if(x == 0) continue;
            for(int j = i + 1;x <= n;j++){
                uset.insert(x);
                if(j == m) break;
                x = (x << 1) | (s[j] - '0');
            }
        }

        return uset.size() == n;
    }
};

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值