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

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

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

题目描述

给你一个二进制字符串s,你可以进行两种操作:

  1. 翻转任意一个字符(0 变 1,1 变 0)。
  2. 将字符串的第一个字符移动到末尾(即旋转)。

你可以任意次旋转,然后进行若干次翻转,使得最终的字符串变成交替字符串(即相邻字符都不相同)。求最少翻转次数。

解题思路

交替字符串的两种模式

长度为n的交替字符串只有两种可能:

  • 模式0:以0开头,偶数下标(0,2,4,…)为0,奇数下标为1
  • 模式1:以1开头,偶数下标为1,奇数下标为0

对于任意一个固定的字符串,我们可以统计偶数位置上0的个数奇数位置上0的个数,然后利用总数推导出与两种模式匹配所需翻转次数:

  • 偶数位置总数 =n - n/2(向上取整),奇数位置总数 =n/2(向下取整)。
  • 与模式0匹配的翻转次数 = (偶数位置总数 - 偶数位0的个数) + 奇数位0的个数 =(n - n/2 - even0) + odd0
  • 与模式1匹配的翻转次数 = 偶数位0的个数 + (奇数位置总数 - 奇数位0的个数) =even0 + (n/2 - odd0)
    取两者较小值即为当前字符串的最小翻转次数。

旋转的影响

旋转操作会使字符串的索引发生变化:每旋转一次,原第一个字符移到最后,其余字符的索引减 1。这会导致原本在偶数位置的字符变成奇数位置,反之亦然(除了移到末尾的那个字符)。因此,如果我们能维护当前字符串中偶数位置和奇数位置上0的个数,就可以通过模拟旋转过程,计算出所有旋转情况下的最少翻转次数。

核心算法

  1. 先统计原始字符串中偶数下标和奇数下标上0的个数even0odd0
  2. 初始化答案为n(最大可能值)。
  3. 循环n次,模拟每次旋转后的状态更新:
    • 移除当前第一个字符(原字符串的第i个字符,它在当前字符串中位于下标 0)。如果该字符是'0',则even0--(因为下标 0 是偶数)。
    • 剩余字符的索引全部减 1,奇偶性互换:交换odd0even0
    • 把刚才移除的字符放到末尾,它现在位于下标n-1。如果该字符是'0',根据n-1的奇偶性增加对应的计数(n-1为偶数则even0++,否则odd0++)。
    • 利用当前的even0odd0计算两种模式的最小翻转次数,更新答案。
  4. 返回答案。

代码实现(C++)

classSolution{public:intminFlips(string s){intn=s.length();inteven0=0,odd0=0;// 原始字符串中偶数下标、奇数下标上 '0' 的个数for(inti=0;i<n;++i){if(s[i]=='0'){if(i&1)odd0++;// 奇数下标elseeven0++;// 偶数下标}}intans=n;// 初始化答案为最大值 nfor(inti=0;i<n;++i){// 1. 移除第一个字符(下标 0)if(s[i]=='0')even0--;// 2. 剩余字符索引减1,奇偶互换swap(odd0,even0);// 3. 把移出的字符放到末尾(下标 n-1)if(s[i]=='0'){if((n-1)&1)odd0++;// n-1 为奇数elseeven0++;// n-1 为偶数}// 计算当前旋转后的字符串所需最少翻转次数// 偶数位置总数 = n - n/2,奇数位置总数 = n/2intflips=min(even0+n/2-odd0,odd0+n-n/2-even0);ans=min(ans,flips);}returnans;// ans 一定非负,直接返回}};

复杂度分析

  • 时间复杂度:O(n),只需一次遍历和一次循环,没有额外嵌套。
  • 空间复杂度:O(1),只使用了常数个变量。

总结

本题的关键在于理解旋转对字符奇偶位置的影响,通过维护偶数位和奇数位上0的个数,可以 O(n) 时间内求出所有旋转情况的最少翻转次数。这种模拟旋转并动态更新计数的方法避免了显式地旋转字符串,非常高效。

扩展:如果题目要求输出最少翻转次数对应的具体旋转次数,也可以在此算法基础上记录。

http://www.jsqmd.com/news/450197/

相关文章:

  • Seata 系列-1:基础概念
  • 论文写作新神器:书匠策AI,文献综述的“智慧魔法师”
  • Transformer进阶技术全景解析系列(第一篇:高效注意力机制——让Transformer“轻装上阵”)
  • 生物钟编码:基因定制开发效率表
  • 基于Java Swing + MySQL的学生住宿管理系统的设计与实现
  • 基于Java springboot高校洗浴预约管理系统(源码+文档+运行视频+讲解视频)
  • electron 安装教程
  • 基于Java springboot高校科研信息管理系统(源码+文档+运行视频+讲解视频)
  • 啪嗒一声按下空格键,Simulink模型开始跑起来了。显示器上跳动的波形让我突然想起刚接触下垂控制时被交叉耦合支配的恐惧——直到发现解耦控制这剂良药
  • 性能优化在测试资源节约中的价值实现
  • 电动汽车备用能力的市场机制分析与策略优化:实例探讨充电合约、电价响应及市场设计的影响
  • PCB双色油墨评测 打样哪家效果好
  • 当测试文档遭遇Z世代:质量保障体系的代际冲突与重构
  • 基于Python+ai技术的地铁导航旅游小程序
  • 能源AI跨界:电网优化算法开发速成——软件测试从业者的技术迁移指南
  • 探秘书匠策AI:文献综述写作的“智慧魔法棒”
  • 业务开发SOP
  • 是德科技33522B 33621A 33612A 33622A 33611A函数信号发生器
  • 2025最新贴片电容亲测信赖企业
  • 棋牌游戏平台系统架构分析——基于 C++ MFC 的分布式游戏服务器
  • 电力电子技术前沿:Matlab模型展示逆变技术中的电压型单相半桥、全桥逆变电路,展示波形图可应...
  • 蒙特卡洛模拟这玩意儿真有意思,特别是用来折腾电动汽车充电曲线的时候。咱们先甩开膀子搞点代码,生成1000辆电动爹的充电需求
  • Rust 基础面试题及其答案总结一
  • 光储充电站远程监控物联网解决方案
  • 为什么各大公司都热衷投入OpenClaw研究,本质是什么?
  • 计算机毕业设计之基于bs架构的校园活动管理系统
  • 超详细 Python 爬虫指南
  • 收藏必备!小白程序员必看:大模型如何赋能AI医疗,开启万亿新机遇
  • 2026新托福考试信息详解:流程、题型、评分
  • 一文带你深入了解懒汉模式和饿汉模式