zoukankan      html  css  js  c++  java
  • 5778. 使二进制字符串字符交替的最少反转次数 字符串 滑动窗口

    给你一个二进制字符串 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 <= 105
    s[i] 要么是 '0' ,要么是 '1' 。

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

    class Solution {
    public:
        int minFlips(string s) {
            int n = s.size();
            int ans = INT_MAX;
    
            // 对应操作1
            s += s;
    
            string tmp1 = "01";
            string tmp2 = "10";
            int cnt1 = 0, cnt2 = 0;
    
            for (int i = 0; i < s.size(); i++) {
                if (s[i] != tmp1[i % 2]) {
                    cnt1++;
                }
                if (s[i] != tmp2[i % 2]) {
                    cnt2++;
                }
                // 窗口到达上限,开始丢弃前面的元素
                if (i >= n) {
                    if (s[i - n] != tmp1[(i - n) % 2]) {
                        cnt1--;
                    }
                    if (s[i - n] != tmp2[(i - n) % 2]) {
                        cnt2--;
                    }
                }
                // 窗口填满了,开始计算最少需要的类型2操作次数
                if (i >= n - 1) {
                    ans = min(ans, cnt1);
                    ans = min(ans, cnt2);
                }
            }
    
            return ans;
            
        }
    };
    
  • 相关阅读:
    Solidity notes
    Solidity by Example详解
    基本命令中部
    基本命令上部
    服务器介绍
    Linux发展史及安装
    ERROR: Unrecognized command line argument: 'use'
    RequireJs 深入理解
    Redis 安装教程 (Windows 2.6.13 稳定版)
    System.AccessViolationException: 尝试读取或写入受保护的内存 解决办法
  • 原文地址:https://www.cnblogs.com/xgbt/p/14859429.html
Copyright © 2011-2022 走看看