LeetCode 1758. 生成交替二进制字符串的最少操作数(c++)

70 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第10天,点击查看活动详情

前言

从零开始学习c++,每天起码做一道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 <= 104
  • s[i] 是 '0' 或 '1'

二、思路分析

这题一开始把我难倒了。我知道这类题一定有一些巧妙的处理方法。果不其然,由于最终要求的字符串必须是0101010之类不相同的,所以第一个字符必然只有两种情况:0或1。而第二个字符也就必然根据第一个字符固定了下来,也就是说,一共就只可能有两种情况。

同时,要意识到,两种情况所要进行的操作数加起来就等于字符串的长度。

最后,字符'0'的ascii码为48,利用这一点就可以实现字符'0'-字符'9'与数字0-9的转换。

三、AC代码

class Solution {
public:
    int minOperations(string s) {
        int result=0;
        for(int i=0;i<s.size();i++){
            
            if(s[i]!=('0'+i%2)){
                result++;
            }
        }
        result=result<s.size()-result ? result : s.size()-result;
        return result;

    }
};

提交排名

image.png

四、总结

又了解到了一些知识点。