• Leetcode 1758. 生成交替二进制字符串的最少操作数


    Leetcode 1758. 生成交替二进制字符串的最少操作数

    给你一个仅由字符 ‘0’ 和 ‘1’ 组成的字符串 s 。一步操作中,你可以将任一 ‘0’ 变成 ‘1’ ,或者将 ‘1’ 变成 ‘0’ 。

    交替字符串 定义为:如果字符串中不存在相邻两个字符相等的情况,那么该字符串就是交替字符串。例如,字符串 “010” 是交替字符串,而字符串 “0100” 不是。

    返回使 s 变成 交替字符串 所需的 最少 操作数。

    示例 1:

    输入:s = “0100”
    输出:1
    解释:如果将最后一个字符变为 ‘1’ ,s 就变成 “0101” ,即符合交替字符串定义

    示例 2:

    输入:s = “10”
    输出:0
    解释:s 已经是交替字符串。

    示例 3:

    输入:s = “1111”
    输出:2
    解释:需要 2 步操作得到 “0101” 或 “1010” 。

    提示:

    • 1 <= s.length <= 10^4
    • s[i] 是 ‘0’ 或 ‘1’

    我的想法:
    1.最开始想:判断前一个和后一个的字符是否相等:如果相等的话,当为0的时候,后一个字符就置成1;当为1的时候,后一个的字符就置成0。

    class Solution:
        def minOperations(self, s: str) -> int:
            slen = len(s)
            sumnum = 0
            slist = list(s)
            for i in range(slen - 1):
                if slist[i] == slist[i+1]:
                    if slist[i] == "0":
                        slist[i+1] = "1"
                    else:
                        slist[i+1] = "0"
                    sumnum += 1
            return sumnum
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    没有通过测试案例。

    2.然后看了看示例,觉着可能跟0和1的个数有关,试着按着个数来判断。

    class Solution:
        def minOperations(self, s: str) -> int:
            one = s.count("1")
            zero = s.count("0")
            return int(abs(one - zero)/2)
    
    • 1
    • 2
    • 3
    • 4
    • 5

    没有通过测试案例。

    3.干脆一点,给一个字符串,特定长度的交替字符串只有两种可能,以0开头或者以1开头。sumnum 为 与 0101… 比较,不相同的字符个数;othersum 为 为 与 1010… 比较,不相同的字符个数。

    循环遍历字符串 s ,使用 for i in range(slen):。
    当 i 为偶数的时候,对应的 0101010 中 0 的那部分,对应 10101010 中 1 的那部分。当 s[i] 为 0 的时候,即满足 0101010 的条件,不满足 10101010 的条件,othersum += 1,同理当 s[i] 不为 0 的时候,满足 10101010 的条件,不满足 0101010 的条件, sumnum += 1。
    当 i 为奇数的时候也一样。

    因为要取最少的操作数,返回的时候取 sumnum 和 othersum 中的最小值。

    class Solution:
        def minOperations(self, s: str) -> int:
            slen = len(s)
            sumnum = 0 # 与 0101... 比较,不相同的字符个数
            othersum = 0 # 与 1010... 比较,不相同的字符个数
            for i in range(slen):
                if i % 2 == 0:
                    if s[i] == "0":
                        othersum += 1
                    else:
                        sumnum += 1
                else:
                    if s[i] == "1":
                        othersum += 1
                    else:
                        sumnum += 1
            return min(sumnum,othersum)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    粘一下其他人的题解:
    官方 - 模拟
    【宫水三叶】简单模拟题
    【爪哇缪斯】图解LeetCode

  • 相关阅读:
    沃通CA证书支持多所高校招投标文件电子签名
    小白零基础学Java该怎么学习?如何快速入门?
    Springboot路政管理信息系统v93sc计算机毕业设计-课程设计-期末作业-毕设程序代做
    英镑兑美元汇率跌至1985年以来的最低水平 英镑危机临近
    Dynamics 365 使用ILMerge 合并CRM开发后的DLL
    数据库相关知识
    (附源码)php新闻发布平台 毕业设计 141646
    微信小程序-HTML标签和wxml比对
    【Mongodb】READ_ME_TO_RECOVER_YOUR_DATA,数据库被恶意删除
    个人作品录
  • 原文地址:https://blog.csdn.net/li_yizhixiaowukong/article/details/128105816