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

LeetCode 1888. 使二进制字符串字符交替的最少反转次数

题目链接

1888. 使二进制字符串交替的最少翻转次数

题目描述

给你一个二进制字符串 s,你需要通过翻转尽可能少的字符,使得到的字符串成为交替二进制字符串。交替二进制字符串是指相邻两个字符永不相同的字符串(例如 "0101""1010")。

如果字符串的长度是偶数,则交替字符串的两种可能形式为 "0101...""1010...";如果长度是奇数,则两种形式可能在首尾字符相同(因为奇数长度的环形结构需要特殊处理)。

解法分析:滑动窗口(环形处理)

核心思路

该解法通过滑动窗口结合环形字符串处理,高效计算最少翻转次数。核心逻辑如下:

  1. 交替模式:二进制交替字符串有两种基础模式:

    • 模式A:"010101..."(偶数位为0,奇数位为1,下标从0开始)
    • 模式B:"101010..."(偶数位为1,奇数位为0)
    • 两种模式的翻转次数互补(模式B的翻转次数 = 字符串长度 - 模式A的翻转次数)。
  2. 环形处理:通过将字符串视为“环形”,用长度为 2n-1 的循环覆盖所有可能的窗口。

  3. 滑动窗口计算:用滑动窗口遍历所有可能的长度为 n 的子串(覆盖环形的所有起始位置),计算每个窗口对模式A的翻转次数,取最小值(及模式B的互补值)。

代码实现

class Solution:def minFlips(self, s: str) -> int:ans = n = len(s)  # ans:最小翻转次数;n:字符串长度cnt = l = 0       # cnt:当前窗口对模式A的翻转次数;l:窗口左指针# 遍历2n-1个位置(覆盖所有可能的环形窗口)for i in range(2 * n - 1):# 计算当前位置i(模n)对模式A的翻转次数:# 模式A要求i%2位置为i%2(0或1),若字符不等于i%2则需要翻转(加1)cnt += int(s[i % n]) != (i % 2)# 窗口未达到n长度时,继续累加if i + 1 < n:continue# 窗口达到n长度后,更新最小翻转次数:# 模式A的翻转次数为cnt,模式B为n - cnt,取两者最小值ans = min(ans, cnt, n - cnt)# 滑动窗口:移除左指针位置的翻转次数,左指针右移cnt -= int(s[l]) != (l % 2)l += 1return ans

代码解析

  1. 变量初始化

    • ans:初始化为 n(最大可能的翻转次数,即翻转所有字符)。
    • cnt:记录当前窗口对模式A的翻转次数(需要翻转的字符数)。
    • l:滑动窗口的左指针,初始为0。
  2. 环形窗口遍历

    • 循环 i02n-2(共 2n-1 次),通过 i % n 处理环形字符串的索引。
    • int(s[i % n]) != (i % 2):判断当前位置字符是否需要翻转以符合模式A(i%2 是模式A在该位置的目标值)。若需要翻转则 cnt += 1
  3. 窗口长度判断

    • i + 1 < n 时,窗口长度不足 n,继续累加翻转次数。
    • 当窗口长度达到 n 后(i + 1 >= n),开始计算当前窗口的最小翻转次数。
  4. 更新最小翻转次数

    • 对于当前窗口,模式A的翻转次数为 cnt,模式B的翻转次数为 n - cnt(互补关系)。
    • ans = min(ans, cnt, n - cnt):更新全局最小翻转次数。
  5. 滑动窗口维护

    • 移除左指针 l 位置对模式A的翻转次数(int(s[l]) != (l % 2))。
    • 左指针 l += 1,窗口整体右移,继续下一个窗口的计算。

关键逻辑说明

  • 环形覆盖:通过 2n-1 次遍历,覆盖了所有可能的起始位置(0n-1)的窗口,确保奇数长度字符串的跨边界情况被考虑。
  • 模式互补:利用 n - cnt 直接计算模式B的翻转次数,避免重复计算,提高效率。
  • 滑动窗口效率:每个位置仅被加入和移除窗口各一次,时间复杂度为 O(n),空间复杂度为 O(1)

示例详解

s = "01001001101"n=11,奇数)为例:

  • 模式A为 "01010101010",模式B为 "10101010101"
  • 遍历 i0202*11-1=21 次),每个窗口长度为11。
  • 对于窗口 i=10(覆盖 0-10),计算 cnt 为模式A的翻转次数,n - cnt 为模式B的翻转次数。
  • 对于跨边界窗口(如 i=15,覆盖 5-100-4),通过 i%11 处理环形索引,计算翻转次数。
  • 最终 ans 取所有窗口的最小翻转次数。

复杂度分析

  • 时间复杂度O(n),其中 n 是字符串长度。遍历 2n-1 个位置,每个位置的操作是 O(1)
  • 空间复杂度O(1),仅使用常数级额外空间。

总结

该解法通过滑动窗口高效处理了环形二进制字符串的交替翻转问题,核心优势在于:

  1. 环形覆盖:用 2n-1 次遍历覆盖所有可能的起始窗口,解决了奇数长度字符串的跨边界问题。
  2. 模式互补:利用两种模式的翻转次数互补性,减少一半计算量。
  3. 线性效率O(n) 时间复杂度,适用于大规模输入(n10^5)。

这是处理“环形字符串交替”问题的经典方法,结合了滑动窗口和模式互补的思想,是该问题的最优解法之一。


文章转载自:
http://actuation.tmizpp.cn
http://blase.tmizpp.cn
http://able.tmizpp.cn
http://aloof.tmizpp.cn
http://asomatous.tmizpp.cn
http://bushtit.tmizpp.cn
http://amnestic.tmizpp.cn
http://anthurium.tmizpp.cn
http://arcifinious.tmizpp.cn
http://blessedness.tmizpp.cn
http://bondon.tmizpp.cn
http://burrhead.tmizpp.cn
http://altocumulus.tmizpp.cn
http://blockship.tmizpp.cn
http://airing.tmizpp.cn
http://absolute.tmizpp.cn
http://arabian.tmizpp.cn
http://bohemianism.tmizpp.cn
http://assaying.tmizpp.cn
http://aesthetician.tmizpp.cn
http://banquette.tmizpp.cn
http://brownnose.tmizpp.cn
http://cartilaginous.tmizpp.cn
http://caloricity.tmizpp.cn
http://boyd.tmizpp.cn
http://carpetweed.tmizpp.cn
http://apoferritin.tmizpp.cn
http://bioaccumulation.tmizpp.cn
http://autecologic.tmizpp.cn
http://agueweed.tmizpp.cn
http://www.dtcms.com/a/281101.html

相关文章:

  • 维基框架发布 1.0.11 至中央仓,深化国产化 DevOps 生态整合
  • 3-Nodejs-使用fs文件系统模块
  • kotlin的自学笔记1
  • 文心一言开源版部署及多维度测评实例
  • Listener(监听器)
  • 拓扑排序一>可达性统计
  • [WUSTCTF2020]朴实无华
  • Vue 3的核心机制-解析事件流、DOM更新、数据请求、DOM操作规范及组件库DOM操作的解决方案
  • 日记_7.14_实际开发的进步
  • 使用Spring Cloud LoadBalancer报错java.lang.IllegalStateException
  • Wordpress登录数据库连接失败的问题
  • Web攻防-PHP反序列化字符逃逸增多减少成员变量属性解析不敏感Wakeup绕过
  • 网络:TCP序列号和滑动窗口,顺序保证
  • 【R语言】警告conversion failure on ‘中文字符‘ in ‘mbcsToSbcs‘: for 注 (U+6CE8)
  • 枪机、支持POE、4G连接交换机实现多屏幕显示
  • 【郑大二年级信安小学期】Day12:编写渗透测试脚本搭建虚拟环境
  • 淘宝扭蛋机小程序开发:重构电商娱乐化体验的新范式
  • 不同系统记录项目进度不一致,如何统一口径
  • 【Linux系统】命令行参数和环境变量
  • gitee某个分支合并到gitlab目标分支
  • 微信小程序未登录状态下的导航拦截有哪些方法可以实现
  • AI大模型应用架构演进:从LLM基础到Agent协作的范式转移
  • GBase 8a 与 Spring Boot + MyBatis 整合实战:从环境搭建到CRUD操作
  • 扩展:操作系统之高性能网络计算
  • 使用 mongoimport 导入本地 JSON 文件到 MongoDB 及数据查看指南
  • 微信小程序入门实例_____从零开始 开发一个每天记账的微信小程序
  • Rust语言
  • Isaac Sim仿真赋能机器人工作流,推动具身智能在机器人领域研究
  • 深入解析:磁盘级文件与内存级(被打开)文件的本质区别与联系
  • MySQL锁机制与SQL优化详解