LeetCode429周赛T4
最小化二进制字符串中最长相同子字符串的长度
在处理二进制字符串问题时,优化字符串结构以满足特定条件是一项常见的挑战。本文将探讨一个具体的问题:给定一个长度为 n
的二进制字符串 s
和一个整数 numOps
,通过最多 numOps
次位翻转操作,最小化字符串 s
中最长相同子字符串的长度。
问题描述
输入
- 字符串
s
:长度为n
的二进制字符串,仅由字符'0'
和'1'
组成。 - 整数
numOps
:允许执行的最大位翻转次数。
操作
在每次操作中,你可以选择任意一个下标 i
(0 <= i < n
),并翻转 s[i]
的值:
- 如果
s[i] == '1'
,则将其改为'0'
。 - 如果
s[i] == '0'
,则将其改为'1'
。
目标
通过最多 numOps
次操作,最小化字符串 s
中最长相同子字符串的长度。相同子字符串指的是子字符串中的所有字符都相同。
示例
示例 1
- 输入:
s = "000001"
,numOps = 1
- 输出:
2
- 解释:
- 将
s[2]
改为'1'
,得到s = "001001"
。 - 此时,最长的相同子字符串为
s[0..1]
和s[3..4]
,长度均为2
。
- 将
示例 2
- 输入:
s = "0000"
,numOps = 2
- 输出:
1
- 解释:
- 将
s[0]
和s[2]
改为'1'
,得到s = "1010"
。 - 所有相同子字符串的长度均为
1
。
- 将
示例 3
- 输入:
s = "0101"
,numOps = 0
- 输出:
1
- 解释:
- 不进行任何操作,字符串中所有相同子字符串的长度均为
1
。
- 不进行任何操作,字符串中所有相同子字符串的长度均为
本题重要概念
段的分割
在优化字符串以最小化最长相同子字符串长度的过程中,段的分割是关键步骤。这里的“分割”不仅仅是简单地将字符串切开,而是通过翻转特定位置的字符,将一个连续的相同字符段划分为多个较小的段,从而减少最长段的长度。
具体来说,假设有一个长度为 k 的连续相同字符段。通过翻转其中的若干字符,可以将这个段分割成 seg + 1 个子段。每次翻转一个字符,相当于在该位置引入一个不同字符,从而将原来的段划分为两个部分。例如:
示例:考虑一个包含 10 个连续 ‘0’ 的字符串 “0000000000”。
如果我们翻转其中的 2 个 ‘0’ 为 ‘1’,例如将索引 3 和 7 位置的 ‘0’ 翻转为 ‘1’,字符串变为 “0001000100”。
这样,原本的 10 个 ‘0’ 被分割成了三个子段:“000”, “000”, 和 “00”。
经过这次分割,最长的 ‘0’ 子段长度由 10 减少到了 3。
通过这种方式,每次翻转操作都能有效地将一个较长的段分割成多个较短的段,从而逐步减少整个字符串中最长相同子字符串的长度。具体来说,一个长度为 k 的段,经过 seg 次分割后,每个子段的最大长度大约为 ceil(k / (seg + 1))。
解题思路
要最小化字符串中最长相同子字符串的长度,可以通过以下步骤进行优化:
-
检查是否可以分割为长度为1的子串:
- 首先判断是否可以通过最多
numOps
次翻转操作将字符串s
转换为一个交替字符串,如"1010"
或"0101"
。 - 如果可以实现,则返回
1
,因为此时最长的相同子字符串长度为1
。
- 首先判断是否可以通过最多
-
处理长度为2的字符串:
- 对于长度为2的字符串,如果无法转换为交替字符串(即已经是
"00"
或"11"
),则不需要进一步分割。 - 因为分割长度为2的字符串会影响前后部分,且前面已经判断了是否可以得到长度为1的结果。
- 如果当前最长的子串长度已经是2,则答案必定是2。
- 对于长度为2的字符串,如果无法转换为交替字符串(即已经是
-
分段统计:
- 将字符串
s
分割成连续的相同字符段。例如,"000001"
可以分为["00000", "1"]
。
- 将字符串
-
优先处理最长段:
- 通过优先将最长的相同字符段进行分割,可以有效减少最长段的长度。具体而言,使用优先队列(堆)来不断选择当前最长的段进行分割。
-
段的分割:
- 每次分割一个段,将其分成更多的小段,从而降低该段的最大长度。
- 假设一个段的长度为
k
,通过翻转特定位置的字符,将这个段分割seg次,成seg + 1
个子段,每段的最大长度约为ceil(k / (seg + 1))
。
-
迭代操作:
- 重复上述过程,直到用完所有的操作次数
numOps
或者无法进一步优化。
- 重复上述过程,直到用完所有的操作次数
-
最终结果:
- 操作完成后,堆顶元素即为当前最长相同子字符串的长度。
代码实现
from heapq import heapify, heapreplace
from itertools import groupbyclass Solution:def minLength(self, s: str, numOps: int) -> int:n = len(s)# 首先检查是否可以通过 numOps 次翻转将字符串转为交替字符串# 交替字符串有两种可能:"0101..." 或 "1010..."# 计算将 s 转换为这两种模式所需的翻转次数ops_to_alternate_0 = sum(1 for i, c in enumerate(s) if c != ('0' if i % 2 == 0 else '1'))ops_to_alternate_1 = sum(1 for i, c in enumerate(s) if c != ('1' if i % 2 == 0 else '0'))min_ops_to_alternate = min(ops_to_alternate_0, ops_to_alternate_1)# 如果可以通过翻转操作将字符串转为交替字符串,则最长相同子字符串长度为1if min_ops_to_alternate <= numOps:return 1# 特殊处理长度为2的字符串if n == 2:# 如果已经是交替字符串,返回1if s[0] != s[1]:return 1# 否则,需要至少1次操作将其分割为交替elif numOps >= 1:return 1else:return 2 # 无法分割,最长相同子字符串长度为2# 分组统计连续相同字符的段groups = [len(list(group)) for _, group in groupby(s)]# 如果分组中所有段的长度均为1,则已经是交替字符串if all(g == 1 for g in groups):return 1# 初始化堆,存储每个段的最大长度及分割次数# 堆中存储 (-最大长度, 原始长度, 分割次数)heap = [(-g, g, 1) for g in groups]heapify(heap)for _ in range(numOps):max_seg, k, seg = heap[0]# 如果当前最长段已经不能进一步分割if max_seg == -2:return 2# 将当前最长段进行一次分割# 新的最大长度为 ceil(k / (seg + 1)),这里用整除代替ceil# 因为 k // (seg + 1) 已经是向下取整,取负数用于最大堆new_max = -(k // (seg + 1))# 更新分割次数new_seg = seg + 1# 替换堆顶元素heapreplace(heap, (new_max, k, new_seg))# 返回操作后的最长相同子字符串长度return -heap[0][0]
相关文章:
LeetCode429周赛T4
最小化二进制字符串中最长相同子字符串的长度 在处理二进制字符串问题时,优化字符串结构以满足特定条件是一项常见的挑战。本文将探讨一个具体的问题:给定一个长度为 n 的二进制字符串 s 和一个整数 numOps,通过最多 numOps 次位翻转操作&am…...

详解MySQL在Windows上的安装
目录 查看电脑上是否安装了MySQL 下载安装MySQL 打开MySQL官网,找到DOWNLOADS 然后往下翻,找到MySQL Community(GPL) Downloads>> 然后找到MySQL Community Server 然后下载,选择No thanks,just start my download. 然后双击进行…...

【Python使用】嘿马python高级进阶全体系教程第10篇:静态Web服务器-返回固定页面数据,1. 开发自己的静态Web服务器【附代码文档】
本教程的知识点为:操作系统 1. 常见的操作系统 4. 小结 ls命令选项 2. 小结 mkdir和rm命令选项 1. mkdir命令选项 压缩和解压缩命令 1. 压缩格式的介绍 2. tar命令及选项的使用 3. zip和unzip命令及选项的使用 4. 小结 编辑器 vim 1. vim 的介绍 2. vim 的工作模式 …...

软件测试面试题和简历模板(面试前准备篇)
一、问题预测 1、让简单介绍下自己(这个不用说了每次面试开场) 面试官,你好,我叫xxx,xx年本科毕业,从事软件测试将近3年的时间。在此期间做过一些项目也积累过一些经验,能够独立地完成软件测试…...

Linux 基本使用和程序部署
1. Linux 环境搭建 1.1 环境搭建方式 主要有 4 种: 直接安装在物理机上。但是Linux桌面使用起来非常不友好,所以不建议。[不推荐]。使用虚拟机软件,将Linux搭建在虚拟机上。但是由于当前的虚拟机软件(如VMWare之类的)存在一些bugÿ…...
uniapp微信小程序,使用fastadmin完成一个一键获取微信手机号的功能
前端部分 点击按钮,获取手机号 <button open-type"getPhoneNumber" getphonenumber"bindGetPhoneNumber" hover-class"none"class"btn-purity">一键获取</button> 传入openid和code bindGetPhoneNumber(e) …...
CSS系列(27)- 图形与滤镜详解
前端技术探索系列:CSS 图形与滤镜详解 🎨 致读者:探索CSS的艺术表现力 👋 前端开发者们, 今天我们将深入探讨 CSS 图形和滤镜效果,学习如何创建引人注目的视觉效果。 基础图形 🚀 几何形状…...

Docker 技术系列之安装多版本Mysql5.6和Mysql5.7
image 大家好,后面的就不是关于MAC专有的内容,基本是跟Java环境,基础技术方面有关。所以这个教程对于在linux系统还是macOS都是通用的,不用担心。 上一篇,我们安装好对应的Docker之后,感受到了它的便利。接…...
理解并使用Linux 内核中的 Tracepoint
理解并使用Linux 内核中的 Tracepoint 1. 引言 1.1 为什么需要 Tracepoint? 在内核调试与性能分析中,传统的 printk 方法虽然简单直接,但存在几个显著的局限性: 日志噪音:printk 会将所有输出无差别地记录到系统日…...

centos7中Gbase8s数据库安装,以及数据导入遇到的一系列问题
centos7中Gbase8s数据库安装,以及遇到的一系列问题 以下是我在centos7上安装gbase8s数据库遇到的一系列问题,包括数据库安装,数据导入,数据连接,不能完全作为标准,只可作为类似问题参考,有问题…...

AW36518芯片手册解读(3)
接前一篇文章:AW36518芯片手册解读(2) 二、详述 3. 功能描述 (1)上电复位 当电源电压VIN降至预定义电压VPOR(典型值为2.0V)以下时,该设备会产生复位信号以执行上电复位操作&#x…...

MySQL的REPEATABLE READ事务隔离级别
本文隔离级别: T1内读T2的update数据 首先开两个事务(左二) 事务1修改成李四,提交 事务2再读还是张三,也就是说,记录的数据从事务开始时一直到结束,读的都是同一个版本,读不到T2未提交的此条记录修改&…...
sqoop的参数有哪些?
Sqoop 是一款用于在 Hadoop 与关系型数据库之间进行数据传输的工具,它有很多参数,可分为通用参数、导入参数和导出参数等,以下是一些常见的参数介绍: 通用参数 --connect 说明:指定要连接的关系型数据库的 JDBC URL。…...

动态规划<四> 回文串问题(含对应LeetcodeOJ题)
目录 引例 其余经典OJ题 1.第一题 2.第二题 3.第三题 4.第四题 5.第五题 引例 OJ 传送门Leetcode<647>回文子串 画图分析: 使用动态规划解决 原理:能够将所有子串是否是回文的信息保存在dp表中 在使用暴力方法枚举出所有子串,是…...

跨模态知识迁移:基于预训练语言模型的时序数据建模
在NLP和CV领域,通常通过在统一的预训练模型上进行微调,能够在各自领域的下游任务中实现SOTA(最先进)的结果。然而,在时序预测领域,由于数据量相对较少,难以训练出一个统一的预训练模型来覆盖所有…...

重温设计模式--职责链模式
文章目录 职责链模式的详细介绍C 代码示例C示例代码2 职责链模式的详细介绍 定义与概念 职责链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它旨在将请求的发送者和多个接收者解耦,让多个对象都有机会处理请求&a…...

git冲突解决
git冲突解决 最近遇到了一次git冲突的问题 起因是因为最近公司数据推送部分重构,负责重构的同事就改动了我的一小部分推送的代码,然后等我开发完合并到远程master的时候,报了merge冲突。我对于git工具确实不是很熟练,只是学习了…...
Java学习笔记(14)--面向对象编程
面向对象基础 学习资料来自多态 - Java教程 - 廖雪峰的官方网站 目录 面向对象基础 Override 多态 举个例子 覆写Object方法 调用super final 练习 小结 Override 在继承关系中,子类如果定义了一个与父类方法签名完全相同的方法,被称为覆写&…...
《Swift 字面量》
《Swift 字面量》 介绍 在 Swift 编程语言中,字面量是一种表示源代码中固定值的表达方式。字面量可以直接表示数字、字符串、布尔值等基本数据类型,为编程提供了简洁和直观的方式。Swift 支持多种类型的字面量,包括整数字面量、浮点数字面量…...
数据库 SQL 常用语句全解析
数据库 SQL 常用语句全解析 在数据库领域,SQL(Structured Query Language)作为标准语言,掌控着数据的查询、插入、更新与删除等关键操作。无论是新手入门数据库,还是经验丰富的开发者日常工作,熟练掌握 SQ…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...
Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成
一个面向 Java 开发者的 Sring-Ai 示例工程项目,该项目是一个 Spring AI 快速入门的样例工程项目,旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计,每个模块都专注于特定的功能领域,便于学习和…...

Unity中的transform.up
2025年6月8日,周日下午 在Unity中,transform.up是Transform组件的一个属性,表示游戏对象在世界空间中的“上”方向(Y轴正方向),且会随对象旋转动态变化。以下是关键点解析: 基本定义 transfor…...

sshd代码修改banner
sshd服务连接之后会收到字符串: SSH-2.0-OpenSSH_9.5 容易被hacker识别此服务为sshd服务。 是否可以通过修改此banner达到让人无法识别此服务的目的呢? 不能。因为这是写的SSH的协议中的。 也就是协议规定了banner必须这么写。 SSH- 开头,…...