LeetCode429周赛T4

最小化二进制字符串中最长相同子字符串的长度

在处理二进制字符串问题时,优化字符串结构以满足特定条件是一项常见的挑战。本文将探讨一个具体的问题:给定一个长度为 n 的二进制字符串 s 和一个整数 numOps,通过最多 numOps 次位翻转操作,最小化字符串 s 中最长相同子字符串的长度。

问题描述

输入

  • 字符串 s:长度为 n 的二进制字符串,仅由字符 '0''1' 组成。
  • 整数 numOps:允许执行的最大位翻转次数。

操作

在每次操作中,你可以选择任意一个下标 i0 <= 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. 检查是否可以分割为长度为1的子串

    • 首先判断是否可以通过最多 numOps 次翻转操作将字符串 s 转换为一个交替字符串,如 "1010""0101"
    • 如果可以实现,则返回 1,因为此时最长的相同子字符串长度为 1
  2. 处理长度为2的字符串

    • 对于长度为2的字符串,如果无法转换为交替字符串(即已经是 "00""11"),则不需要进一步分割。
    • 因为分割长度为2的字符串会影响前后部分,且前面已经判断了是否可以得到长度为1的结果。
    • 如果当前最长的子串长度已经是2,则答案必定是2。
  3. 分段统计

    • 将字符串 s 分割成连续的相同字符段。例如,"000001" 可以分为 ["00000", "1"]
  4. 优先处理最长段

    • 通过优先将最长的相同字符段进行分割,可以有效减少最长段的长度。具体而言,使用优先队列(堆)来不断选择当前最长的段进行分割。
  5. 段的分割

    • 每次分割一个段,将其分成更多的小段,从而降低该段的最大长度。
    • 假设一个段的长度为 k,通过翻转特定位置的字符,将这个段分割seg次,成 seg + 1 个子段,每段的最大长度约为 ceil(k / (seg + 1))
  6. 迭代操作

    • 重复上述过程,直到用完所有的操作次数 numOps 或者无法进一步优化。
  7. 最终结果

    • 操作完成后,堆顶元素即为当前最长相同子字符串的长度。

代码实现

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]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/494363.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UE5 猎户座漂浮小岛 12 技能 瞬移 重力控制

1. 瞬移 1.1. 显示鼠标光标 “事件开始运行”添加显示鼠标逻辑 1.2. 释放技能蓝图 设置技能键 编写蓝图 1.3. 瞬移最大距离 2. 重力控制 2.1. 添加输入与动画 映射 重定向得到动画 新增状态FIRE_GracityControl 设置动画姿势 新增变量 切换动画 2.2. 技能蓝图&#xff08;…

叉车作业如何确认安全距离——UWB测距防撞系统的应用

叉车在工业环境中运行&#xff0c;常常需要在狭窄的空间内完成货物的搬运和堆垛&#xff0c;这对操作员的技术水平和安全意识提出了极高的要求。传统的叉车作业依赖操作员的经验和视觉判断来确认安全距离&#xff0c;然而这种方式往往存在误差&#xff0c;特别是在视线受阻或光…

深度学习每周学习总结J9(Inception V3 算法实战与解析 - 天气识别)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 目录 0. 总结Inception V1 简介Inception V3 简介1. 设置GPU2. 导入数据及处理部分3. 划分数据集4. 模型构建部分5. 设置超参数&#xff1…

记录仪方案_记录仪安卓主板定制_音视频记录仪PCBA定制开发

记录仪主板采用了强大的联发科MTK8768处理器&#xff0c;拥有出色的性能表现。它搭载了四个主频为2.0GHz的Cortex-A53核心与四个主频为1.5GHz的Cortex-A53核心&#xff0c;确保了高效的处理速度。此外&#xff0c;主板配备了4GB的RAM(可选8GB)&#xff0c;并且内置64GB的ROM(可…

梳理你的思路(从OOP到架构设计)_简介设计模式

目录 1、 模式(Pattern) 是较大的结构​编辑 2、 结构形式愈大 通用性愈小​编辑 3、 从EIT造形 组合出设计模式 1、 模式(Pattern) 是较大的结构 组合与创新 達芬奇說&#xff1a;簡單是複雜的終極形式 (Simplicity is the ultimate form of sophistication) —Leonardo d…

JavaScriptEs6 - String类和Array类扩展内容

title: Javascript-ES6扩展写法 date: 2024-12-23 00:12:19 推荐在我的个人博客网站上访问本文章&#xff1a;shenying.website String 对象扩展 模版字符串 类似字符串的写法&#xff0c;用 来包裹字符串&#xff0c;优点是可以不用反斜杠就能在代码中多行编辑。对于模版字…

图书管理系统:提升图书馆服务质量的技术解决方案

可行性分析 在项目进行开发之前&#xff0c;必须要有可行性分析报告&#xff0c;分别从技术角度&#xff0c;经济角度&#xff0c;操作角度上面进行分析&#xff0c;经过可行性分析是实现科学开发的必要步骤。 3.1.1技术可行性 从技术的角度出发&#xff0c;目前采用开发的技术…

Unity中有什么情况下是需要用UniTask替代其他异步方式的吗?

在Unity开发中&#xff0c;是否需要使用UniTask替代其他异步方式&#xff08;如Coroutine或Task&#xff09;&#xff0c;取决于项目需求、代码风格和性能考量。UniTask是一个第三方库&#xff0c;主要用于优化和简化Unity环境下的异步编程&#xff0c;它提供了诸多优势&#x…

NLP 中文拼写检测开源-01-基于贝叶斯公式的拼写检查器 CSC

拼写纠正系列 NLP 中文拼写检测实现思路 NLP 中文拼写检测纠正算法整理 NLP 英文拼写算法&#xff0c;如果提升 100W 倍的性能&#xff1f; NLP 中文拼写检测纠正 Paper java 实现中英文拼写检查和错误纠正&#xff1f;可我只会写 CRUD 啊&#xff01; 一个提升英文单词拼…

SpringBoot核心:自动配置

有使用过SSM框架的&#xff0c;还记得曾经在spring-mybatis.xml配置了多少内容吗&#xff1f;数据源、连接池、会话工厂、事务管理&#xff0c;而现在Spring Boot告诉你这些都不需要了&#xff0c;简单的几个注解统统搞定&#xff0c;是不是很方便&#xff01; 前言 SpringBoo…

重温设计模式--职责链模式

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

微信小程序UI自动化测试实践 !

微信小程序UI自动化测试实践 引言&#xff1a; 随着微信小程序的快速发展&#xff0c;越来越多的企业和开发者开始开发小程序来满足用户的需求。而在开发小程序的过程中&#xff0c;UI自动化测试是一个必不可少的环节&#xff0c;可以帮助开发者减少人工测试的工作量&#xff…

C#在自定义事件里传递数据

通过自定义事件来传值。此种方法适合于写驱动程序。进行数据采集。 对于一般的系统事件&#xff0c;是有两个参数的&#xff0c;一个是sender&#xff0c;一个是EventArgs&#xff0c;对于sender&#xff0c;个事件的触发者&#xff0c;一般指向的是一个控件&#xff0c;但是对…

MacroSan 2500_24A配置

双控制器电源同时按下,切记/切记/切记 默认信息 默认地址:192.168.0.210 输入ODSP授权后设置密码## 配置端口 物理资源–>设备–>网口–>eth-1:0:0或eth-2:0:0 创建存储池 存储资源–>存储池 介质类型:混合(支持机械及SSD)全闪(仅支持SSD) RAID类型:CRAID-P(基于磁…

法学硕士,有哪些专业可以申请呢?

同等学力申请硕士学位 &#xff08;简称“同等学力申硕”&#xff09; 是指本科毕业获得学士学位的人员&#xff0c;通过工作之余的时间参与课程的学习&#xff0c; 把专业知识水平提升至研究生毕业的同等水平&#xff0c; 在院校的专业考核和国家统考成绩通过后&#xff0c; 成…

大数据操作实验一

实验一&#xff1a;https://www.hifleet.com/wp/communities/data/hangyundashujujishukechengshiyanzhinan 1.Postgresql 1.1 数据库的对象创建 1.1.1 创建数据库(Database) 鼠标右键database进行创建 1.1.2 创建图(Schema) 鼠标右键schema&#xff0c;然后创建schema图…

Java Spring Boot 项目中嵌入前端静态资源:完整教程与实战案例

言简意赅的讲解Java Spring Boot 中嵌入前端项目的静态资源解决的痛点 之前给大家讲解了如何部署一个前端项目&#xff0c;但大家还是好奇如何部署一个前后端一体项目。将前端构建后的静态资源嵌入 Java Spring Boot 后端项目&#xff0c;是现代全栈开发中一种流行的实践方式。…

独一无二,万字详谈——Linux之文件管理

Linux文件部分的学习&#xff0c;有这一篇的博客足矣! 目录 一、文件的命名规则 1、可以使用哪些字符&#xff1f; 2、文件名的长度 3、Linux文件名的大小写 4、Linux文件扩展名 二、文件管理命令 1、目录的创建/删除 &#xff08;1&#xff09;、目录的创建 ① mkdir…

ctfshow web入门文件上传总结

1.web151 前端验证 前端验证&#xff0c;修改html代码&#xff0c;上传还有一句话木马的php文件,之后用蚁剑连接即可找到flag <?php eval($_POST[1])?>2.web152 后端验证&#xff0c;修改mime类型(content-type) burp抓包&#xff0c;修改content-type为image/png …

R9000P键盘失灵解决办法

问题描述 突然&#xff0c;就是很突然&#xff0c;我买的R9000P 2024不到三个月&#xff0c;键盘突然都不能用了&#xff0c;是所有键盘按键都无效的那种。&#xff08;可以使用外接键盘&#xff09; 解决办法 我本科室友说的好哈&#xff0c;全坏全没坏。 &#xff08;该解…