当前位置: 首页 > article >正文

LeetCode每日一题3258---统计满足 K 约束的子字符串数量 I

一、题目描述

给你一个 二进制 字符串 s 和一个整数 k

如果一个 二进制字符串 满足以下任一条件,则认为该字符串满足 k 约束:

字符串中 0 的数量最多为 k。
字符串中 1 的数量最多为 k。
返回一个整数,表示 s 的所有满足 k 约束 的
子字符串
的数量。

示例 1:
输入:s = “10101”, k = 1

输出:12

解释:
s 的所有子字符串中,除了 “1010”、“10101” 和 “0101” 外,其余子字符串都满足 k 约束。

示例 2:
输入:s = “1010101”, k = 2

输出:25

解释:
s 的所有子字符串中,除了长度大于 5 的子字符串外,其余子字符串都满足 k 约束。

示例 3:
输入:s = “11111”, k = 1

输出:15

解释:
s 的所有子字符串都满足 k 约束。

提示:
1 <= s.length <= 50
1 <= k <= s.length
s[i] 是 ‘0’ 或 ‘1’。

二、解题思路

这道题目可以利用了滑动窗口的技巧来维护一个动态的子串区间 [l, i],并确保窗口内的 ‘1’ 和 ‘0’ 的数量都不超过 k。滑动窗口可以高效地解决这种类型的子串计数问题。

  • 当窗口内的 ‘1’ 或 ‘0’ 的数量超过 k 时,窗口左边(l)会被向右移动,直到窗口变得有效。
  • 每当窗口有效时,表示从 l 到 i 的子串都符合条件,因此将它们的数量(即 i - l + 1)加到结果中。

三、代码

class Solution {
public:
    int countKConstraintSubstrings(string s, int k) {
        int l = 0;
        int count = 0;
        int one = 0;
        int zero = 0;
        for (int i = 0; i < s.size(); i++) {
            if (s[i] == '1') one++;
            else zero++;
            while (one > k && zero > k) {
                if (s[l++] == '1') one--;
                else zero--;
            }
            count += i - l + 1;
        }
        return count;
    }
};

http://www.kler.cn/a/390121.html

相关文章:

  • DOM 规范 — MutationObserver 接口
  • STM32单片机WIFI语音识别智能衣柜除湿消毒照明
  • Lucene 和 Elasticsearch 中更好的二进制量化 (BBQ)
  • 金价大跌,特朗普胜选或成导火索
  • 软件测试面试题(800道)【附带答案】持续更新...
  • 2024开发者浏览器必备扩展,不允许还有人不知道~
  • pycharm连接oracle数据库查询数据
  • C# 多线程编程
  • 文本语义分块、RAG 系统的分块难题:小型语言模型如何找到最佳断点
  • Spring Boot框架下编程训练系统开发指南
  • 【Docker】Mac安装Docker Desktop导致磁盘剩余空间较少问题如何解决?
  • Spring Cloud Alibaba Spring Cloud Spring Boot JDK 版本依赖关系
  • jQuery UI 使用
  • 性能测试链路分析与压测平台的对接
  • 【逆向爬虫实战】--全方位分析+某某学堂登录(DES加密)
  • Vue功能菜单的异步加载、动态渲染
  • URL、DNS、IP介绍及特点
  • GitHub 上的开源项目推荐
  • PHP弱类型安全问题
  • React前端开发
  • 虚拟化数据恢复—ESXi虚拟机数据恢复案例
  • 蓝桥杯c++算法学习【1】之枚举与模拟(卡片、回文日期、赢球票、既约分数:::非常典型的比刷例题!!!)
  • 阿里云Linux安装Docker服务报错问题
  • SpringBoot(十一)SpringBoot上传文件
  • 2024年11月11日Github流行趋势
  • 2023年12月中国电子学会青少年软件编程(Python)等级考试试卷(三级)答案 + 解析