LeetCode:3258.统计满足k约束的子串数量 I(滑动窗口 Java)

目录

[3258.统计满足k约束的子串数量 I](#3258.统计满足k约束的子串数量 I)

题目描述:

实现代码与解析:

滑动窗口

原理思路:


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'

Related Topics

  • 字符串
  • 滑动窗口

实现代码与解析:

滑动窗口

java 复制代码
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
    public int countKConstraintSubstrings(String s, int k) {

        int n = s.length();
        int res = 0;
        int l = 0;
        int cnt0 = 0, cnt1 = 0;
        for (int r = 0; r < n; r++) {
            if (s.charAt(r) == '0') {
                cnt0++;
            }
            if (s.charAt(r) == '1') {
                cnt1++;
            }
            while (cnt0 > k && cnt1 > k) {
                if (s.charAt(l) == '0') cnt0--;
                if (s.charAt(l) == '1') cnt1--;
                l++;
            }
            res += r - l + 1;
        }
        return res;
    }
}
//leetcode submit region end(Prohibit modification and deletion)

原理思路:

遍历右指针,记录0和1的个数,求出当前右指针情况下,满足条件的最长长度。如果满足条件,收缩左指针,直到满足条件。

相关推荐
凉年技术2 小时前
Java 实现企业微信扫码登录
java·企业微信
xlp666hub2 小时前
Leetcode第五题:用C++解决盛最多水的容器问题
linux·c++·leetcode
狂奔小菜鸡2 小时前
Day41 | Java中的锁分类
java·后端·java ee
hooknum3 小时前
学习记录:基于JWT简单实现登录认证功能-demo
java
CoovallyAIHub3 小时前
9个视觉语言模型工厂实测:Qwen 87.9%碾压全场,你的显卡能跑哪个?
算法
SparkX开源AI知识库3 小时前
手摸手带你安装OpenClaw并对接飞书
算法·架构
程序员Terry3 小时前
同事被深拷贝坑了3小时,我教他原型模式的正确打开方式
java·设计模式
NE_STOP3 小时前
MyBatis-缓存与注解式开发
java
一语07163 小时前
3分钟搞懂深度学习AI:实操篇:卷积层
人工智能·算法
码路飞4 小时前
不装 OpenClaw,我用 30 行 Python 搞了个 QQ AI 机器人
java