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的个数,求出当前右指针情况下,满足条件的最长长度。如果满足条件,收缩左指针,直到满足条件。

相关推荐
艾莉丝努力练剑9 分钟前
【洛谷刷题】用C语言和C++做一些入门题,练习洛谷IDE模式:分支机构(一)
c语言·开发语言·数据结构·c++·学习·算法
CHEN5_0224 分钟前
【Java基础面试题】Java基础概念
java·开发语言
二十雨辰1 小时前
[TG开发]照片机器人
java·web3
武昌库里写JAVA1 小时前
JAVA面试汇总(四)JVM(一)
java·vue.js·spring boot·sql·学习
C++、Java和Python的菜鸟2 小时前
第六章 统计初步
算法·机器学习·概率论
Cx330❀2 小时前
【数据结构初阶】--排序(五):计数排序,排序算法复杂度对比和稳定性分析
c语言·数据结构·经验分享·笔记·算法·排序算法
散1122 小时前
01数据结构-Prim算法
数据结构·算法·图论
起个昵称吧2 小时前
线程相关编程、线程间通信、互斥锁
linux·算法
落霞的思绪2 小时前
Java设计模式详细解读
java·开发语言·设计模式
Java小白程序员2 小时前
Spring Framework:Java 开发的基石与 Spring 生态的起点
java·数据库·spring