LeetCode——1888. 使二进制字符串字符交替的最少反转次数[Minimum Number of Flips to Make the Binary String Alternating][中等]——分析及代码[Java]

  • 一、题目
  • 二、分析及代码
    • 1. 滑动窗口
      • (1)思路
      • (2)代码
      • (3)结果
  • 三、其他

一、题目

给你一个二进制字符串 s 。你可以按任意顺序执行以下两种操作任意次:

  • 类型 1 :删除 字符串 s 的第一个字符并将它 添加 到字符串结尾。
  • 类型 2 :选择 字符串 s 中任意一个字符并将该字符 反转 ,也就是如果值为 ‘0’ ,则反转得到 ‘1’ ,反之亦然。

请你返回使 s 变成 交替 字符串的前提下, 类型 2 的 最少 操作次数 。

我们称一个字符串是 交替 的,需要满足任意相邻字符都不同。

  • 比方说,字符串 “010” 和 “1010” 都是交替的,但是字符串 “0100” 不是。

示例 1:

输入:s = "111000"
输出:2
解释:执行第一种操作两次,得到 s = "100011" 。
然后对第三个和第六个字符执行第二种操作,得到 s = "101010" 。

示例 2:

输入:s = "010"
输出:0
解释:字符串已经是交替的。

示例 3:

输入:s = "1110"
输出:1
解释:对第二个字符执行第二种操作,得到 s = "1010" 。

提示:

  • 1 <= s.length <= 10^5
  • s[i] 要么是 ‘0’ ,要么是 ‘1’ 。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-number-of-flips-to-make-the-binary-string-alternating
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、分析及代码

1. 滑动窗口

(1)思路

对操作 1,将第一个字符移动到字符串结尾,等效于先将 s 首尾相接构造一个长度为 2 * len 的字符串,再通过长度为 len 的滑动窗口取最小值。
因为最终得到的交替字符串只可能是 “0101010…” 或 “1010101…” 2 种情况,对这 2 种状态分别求解所需的操作次数即可。

(2)代码

class Solution {public int minFlips(String s) {String ss = s + s;//先将s首尾相接构造一个长度为2*len的字符串,再通过长度为len的滑动窗口取最小值char[] str = ss.toCharArray();int len = s.length(), n = str.length, ans = Integer.MAX_VALUE;int[] op1 = new int[n + 1], op2 = new int[n + 1];//op1[i]、op2[i]表示构造得到"01010..."和"10101..."前i位的操作次数op1[0] = 0;op2[0] = 0;for (int i = 0; i < n; i++) {if ((i & 1) == (int)(str[i] - '0')) {//奇数位为1或偶数位为0op1[i + 1] = op1[i];op2[i + 1] = op2[i] + 1;} else {//奇数位为0或偶数位为1op1[i + 1] = op1[i] + 1;op2[i + 1] = op2[i];}}for (int i = len; i <= n; i++) {//移动长度为len的滑动窗口,取最小操作次数ans = Math.min(ans, op1[i] - op1[i - len]);ans = Math.min(ans, op2[i] - op2[i - len]);}return ans;}
}

(3)结果

执行用时 :19 ms,在所有 Java 提交中击败了 82.13% 的用户;
内存消耗 :41.6 MB,在所有 Java 提交中击败了 20.17% 的用户。

三、其他

暂无。

LeetCode——1888. 使二进制字符串字符交替的最少反转次数(Minimum Number of Flips to Make the Binary ...)[中等]——分析及代码(Java)相关推荐

  1. LeetCode——1849. 将字符串拆分为递减的连续值(Splitting a String Into Descending Consecutive Val..)[中等]——分析及代码(Java)

    LeetCode--1849. 将字符串拆分为递减的连续值[Splitting a String Into Descending Consecutive Values][中等]--分析及代码[Java ...

  2. LeetCode——1871. 跳跃游戏 VII(Jump Game VII)[中等]——分析及代码(Java)

    LeetCode--1871. 跳跃游戏 VII[Jump Game VII][中等]--分析及代码[Java] 一.题目 二.分析及代码 1. 动态规划 + 队列 (1)思路 (2)代码 (3)结果 ...

  3. LeetCode——1143. 最长公共子序列(Longest Common Subsequence)[中等]——分析及代码(Java)

    LeetCode--1143. 最长公共子序列[Longest Common Subsequence][中等]--分析及代码[Java] 一.题目 二.分析及代码 1. 动态规划 (1)思路 (2)代 ...

  4. LeetCode——1947. 最大兼容性评分和(Maximum Compatibility Score Sum)[中等]——分析及代码(Java)

    LeetCode--1947. 最大兼容性评分和[Maximum Compatibility Score Sum][中等]--分析及代码[Java] 一.题目 二.分析及代码 1. 状态压缩 + 动态 ...

  5. LeetCode——1846. 减小和重新排列数组后的最大元素(Maximum Element After Decreasing and Rearranging)[中等]——分析及代码(Java)

    LeetCode--1846. 减小和重新排列数组后的最大元素[Maximum Element After Decreasing and Rearranging][中等]--分析及代码[Java] 一 ...

  6. LeetCode——909. 蛇梯棋(Snakes and Ladders)[中等]——分析及代码(Java)

    LeetCode--909. 蛇梯棋[Snakes and Ladders][中等]--分析及代码[Java] 一.题目 二.分析及代码 1. 广度优先搜索 (1)思路 (2)代码 (3)结果 三.其 ...

  7. LeetCode—5757. 矩阵中最大的三个菱形和(Get Biggest ...)[中等]—分析及代码(Java)

    LeetCode--5757. 矩阵中最大的三个菱形和[Get Biggest Three Rhombus Sums in a Grid][中等]--分析及代码[Java] 一.题目 二.分析及代码 ...

  8. LeetCode——1834. 单线程 CPU(Single-Threaded CPU)[中等]——分析及代码(Java)

    LeetCode--1834. 单线程 CPU[Single-Threaded CPU][中等]--分析及代码[Java] 一.题目 二.分析及代码 1. 优先队列 (1)思路 (2)代码 (3)结果 ...

  9. LeetCode——1104. 二叉树寻路(Path In Zigzag Labelled Binary Tree)[中等]——分析及代码(Java)

    LeetCode--1104. 二叉树寻路[Path In Zigzag Labelled Binary Tree][中等]--分析及代码[Java] 一.题目 二.分析及代码 1. 按位置求解 (1 ...

最新文章

  1. python官网下载步骤64位-Python 3.7 64位下载
  2. java编程赋值运算符_跟我学java编程—简单赋值运算符“=”
  3. quad8是matlab中调用那个,Matlab 数值积分
  4. [css] 有哪些标签是不支持伪元素的?
  5. Finding Gems
  6. 【物理总结】初中物理重要常数、单位换算、概念、规律和理论及知识的应用归纳大全梳理总结...
  7. Struts 2框架创建的第一个项目
  8. java jsr305_java – 为什么我需要添加神器JSR305才能使用Guava 14?
  9. Java中利用package机制实现条件编译
  10. 吞食天地2重制版巫妖王panny版存档_11年前的冷饭—Nintendo 任天堂 Switch《宵星传奇 重制版》评测...
  11. JAVA / JS 中关于this和that
  12. WordCloud 中英文词云图绘制,看这一篇就够了
  13. uniapp连接本地服务器请求超时
  14. 求圆和直线之间的交点
  15. 麻姑山行,记南城麻姑山一日游
  16. csapp-buflab
  17. HDU 4507 吉哥系列故事——恨7不成妻(数位DP)
  18. python+pysimplegui+socket开发登录聊天室
  19. Oracle联立多个表建视图,一个简单的联立方程组模型让你了解内外生变量、如何识别以及2SLS估计步骤...
  20. 计算机网络——概述(1)

热门文章

  1. PPT制作技巧汇总之动画设置与播放(office 2007)
  2. AirServer最新Win64位个人版投屏软件
  3. CHROME扩展笔记之设置代理(项目完成再上完整案例)
  4. 【OpenGL】笔记三、着色器
  5. ubuntu设置共享文件夹成功后却不显示找不到
  6. C#精挑整理知识要点11 委托和事件(建议收藏)
  7. 2017年美亚杯资格赛 个人赛 writeup
  8. 智能云时代,谁来守护我们的安全?
  9. 报时功能_厦门宝藏 | 海关大钟悠扬的鸣曲报时,承载着老厦门人无数的记忆!...
  10. DTOJ #5981