Rust 力扣 - 1461. 检查一个字符串是否包含所有长度为 K 的二进制子串

文章目录

题目描述

题解思路

长度为k的二进制子串所有取值的集合为[0, sum(k)],其中sum(k)为1 + 2 + 4 + ... + 1 << (k - 1)

我们只需要创建一个长度为sum(k) + 1的数组 f ,其中下标为 i 的元素用来标记字符串中子串取值为 i 是否不存在

我们只需要遍历字符串中所有长度为 k 的子串,然后将其数组 f 中二进制值标记为存在

最后

  • 如果数组 f 中存在子串中不存在的二进制值,则结果为false
  • 如果数组 f 中子串二进制值都存在,则结果为true

题解代码

rust 复制代码
impl Solution {
    pub fn has_all_codes(s: String, k: i32) -> bool {
        if k as usize >= s.len() {
            return false;
        }

        let s = s.as_bytes();

        let mut max_val = 0;
        
        let mut sum = 0;

        for i in 0..k as usize {
            max_val += 1 << i;
            if s[i] == b'1' {
                sum += 1 << i;
            }
        }

        let mut f = vec![true; max_val + 1];

        f[sum] = false;

        for i in k as usize..s.len() {
            if s[i - k as usize] == b'1' {
                sum -= 1;
            }

            sum >>= 1;

            if s[i] == b'1' {
                sum += 1 << (k - 1);
            }

            f[sum] = false;
        }

        for ok in f {
            if ok {
                return false;
            }
        }

        true
    }
}

题目链接

https://leetcode.cn/problems/check-if-a-string-contains-all-binary-codes-of-size-k/description/

相关推荐
小李子呢02119 小时前
前端八股3---ref和reactive
开发语言·前端·javascript
SWAGGY..9 小时前
【C++初阶】:(7)STL简介
开发语言·c++
金融数据出海9 小时前
java对接美股股票api涵盖实时行情、K 线、指数等核心接口。
后端
dog2509 小时前
卡瓦列里积分赏析
开发语言·php
美式请加冰9 小时前
简单多状态问题
数据结构·算法·leetcode
认真的小羽❅9 小时前
从入门到精通:Spring Boot 整合 MyBatis 全攻略
spring boot·后端·mybatis
计算机安禾9 小时前
【数据结构与算法】第38篇:图论(二):深度优先搜索(DFS)与广度优先搜索(BFS)
数据结构·算法·矩阵·排序算法·深度优先·图论·宽度优先
流星蝴蝶没有剑9 小时前
CoPaw Agent 对接 Python 客户端开发指南:实现流式响应与实时打印
开发语言·python
佑白雪乐10 小时前
<LeetCode>二叉树前/中/后/层遍历**递归&&非递归**
算法·leetcode·深度优先
汀、人工智能10 小时前
[特殊字符] 第56课:在排序数组中查找元素的首末位置
数据结构·算法·数据库架构·图论·bfs·在排序数组中查找元素的首末位置