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

Leetcode刷题Python之3258.统计满足k约束的子字符串I

提示:暴力解法简单易懂能通过。

文章目录

  • 一、题目描述
    • 示例分析
  • 二、解题思路
  • 三、代码实现
    • 代码解析
  • 总结


一、题目描述

给定一个二进制字符串 s(即字符串中只包含字符 0 和 1)以及一个整数 k。要求计算出 s 中满足 “k 约束” 的子字符串数量。满足 k 约束的子字符串定义如下:
1.子字符串中 0 的数量最多为 k。
2.子字符串中 1 的数量最多为 k。

只要子字符串满足以上任意一个条件,即可认为其符合 k 约束条件。


示例分析

示例一

输入:s = "10101", k = 1
输出:12
解释:字符串中,除了 "1010"、"10101" 和 "0101" 以外的其他子字符串都满足 k 约束。

示例二

输入:s = "1010101", k = 2
输出:25
解释:字符串中,长度超过 5 的子字符串不满足 k 约束,其余子字符串均满足。

示例三

输入:s = "11111", k = 1
输出:15
解释:所有子字符串都满足 k 约束。

二、解题思路

为了满足题目要求,我们可以采用暴力法。暴力法的核心思路是枚举 s 中的所有可能子字符串,然后逐个检查每个子字符串的 0 和 1 的数量,判断其是否符合 k 约束条件。这种方法尽管时间复杂度较高,但逻辑简单清晰,适合约束条件低的题目。

具体步骤如下:

1.双重循环生成子字符串:遍历每一个可能的子字符串,并逐个计算每个子字符串中的 0 和 1 数量。

2.计数更新:对于每个生成的子字符串,检查 0 和 1 的数量。如果满足 0 的数量不超过 k 或 1 的数量不超过 k,则增加计数。

3.提前终止内层循环:一旦发现某个子字符串同时不满足 0 和 1 的数量限制,直接跳出内层循环,这样可以节省部分计算量。

三、代码实现

代码如下:

class Solution(object):
    def countKConstraintSubstrings(self, s, k):
        """
        :type s: str
        :type k: int
        :rtype: int
        """
        n = len(s)
        count = 0  # 用于记录满足条件的子字符串数量

        # 遍历每一个子字符串的起始位置
        for i in range(n):
            zero_count = 0  # 当前子字符串中 0 的数量
            one_count = 0   # 当前子字符串中 1 的数量

            # 遍历从 i 开始的每一个可能的结束位置 j
            for j in range(i, n):
                # 更新 01 的数量
                if s[j] == '0':
                    zero_count += 1
                else:
                    one_count += 1

                # 检查是否满足任意一个 k 约束条件
                if zero_count <= k or one_count <= k:
                    count += 1  # 满足条件,计数加一
                else:
                    # 一旦两个条件都不满足,跳出当前循环
                    break

        return count

代码解析

1.变量定义
n 表示字符串的长度。
count 用于记录所有满足条件的子字符串数量。
zero_count 和 one_count 分别记录当前子字符串中 0 和 1 的数量。

2.双层循环
外层循环的变量 i 表示子字符串的起始位置。
内层循环的变量 j 表示子字符串的结束位置,从起始位置 i 开始遍历到字符串末尾。
在遍历过程中,根据字符是 0 还是 1,更新 zero_count 或 one_count。

3.条件判断
每次计算子字符串的 0 和 1 数量后,如果满足 zero_count <= k 或 one_count <= k,将计数 count 加一。
如果 zero_count 和 one_count 均超过 k,直接跳出内层循环,因为在当前起点 i 的条件下,不可能找到更多满足 k 约束的子字符串。


总结

时间复杂度:本算法的时间复杂度为 O(n^2),其中 n 是字符串的长度。因为对于每一个起始位置 i,我们要检查以 i 为起点的所有可能子字符串。
空间复杂度:O(1),只需要一些常量空间来记录 0 和 1 的数量,以及符合条件的子字符串数量。

虽然暴力法的时间复杂度较高,但对于中小规模的输入,性能可以接受。
在这里插入图片描述


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

相关文章:

  • 检测敏感词功能
  • 【WRF理论第十二期】输出文件:wrfout 和 wrfrst
  • 卷积神经网络之Yolo详解
  • Spring Cloud Gateway(分发请求)
  • IP数据云 识别和分析tor、proxy等各类型代理
  • 从华为到创业公司
  • SSM学习记录(二)之SSM整合配置
  • 【Unity基础】对比OnCollisionEnter与OnTriggerEnter
  • 机器学习:CatBoost模型(高级版)——高效且强大的树形模型
  • 深度学习知识点5-马尔可夫链
  • 等保测评怎么做?具体流程是什么?
  • 鸿蒙UIAbility
  • 基于微信小程序的在线疫苗预约的设计与实现,LW+源码+讲解
  • 搜维尔科技:Haption力触觉交互,虚拟机械装配验证
  • 【K8S问题系列 | 9】如何监控集群CPU使用率并设置告警?
  • C++《继承》
  • SpringBoot -- 自动化装配源码
  • 江协科技之STM32驱动1.3寸/0.96寸/0.91寸OLED显示屏介绍
  • js中import引入一个export值可以被修改。vue,react
  • 【计网】计算机网络概述笔记
  • 使用frp工具实现内网穿透
  • 基于yolov8、yolov5的车型检测识别系统(含UI界面、训练好的模型、Python代码、数据集)
  • Scala的迭代器
  • javaWeb小白项目--学生宿舍管理系统
  • C语言不创建中间变量交换2个数
  • win32 / WTL 开发多线程应用,子线程传递大对象给UI线程(主窗口)的方法