1047-翻转字符

最少翻转使得字符串没有连续K个相同字符 最少翻转使得字符串没有连续三个相同字符问题定义解法一解法二 问题定义 给定一个字符串S,包含字符’x’或’y’。在一次翻转中,你可以把’x’变成’y’或把’y’变成’x’,求最少翻转次数,使得该字符串不包含连续的三个相同的字符,如’xxx’或’yyy’。 解法一 以下假设给定的字符串长度为N,使用动态规划,对某位置 i,该位置的字符情况有四种: 它是第一个连续的x 它是第二个连续的x 它是第一... 阅读详情

题目如下

如果一个由 ‘0’ 和 ‘1’ 组成的字符串,是以一些 ‘0’(可能没有 ‘0’)后面跟着一些 ‘1’(也可能没有 ‘1’)的形式组成的,那么该字符串是 单调递增 的。

我们给出一个由字符 ‘0’ 和 ‘1’ 组成的字符串 s,我们可以将任何 ‘0’ 翻转为 ‘1’ 或者将 ‘1’ 翻转为 ‘0’。

返回使 s 单调递增 的最小翻转次数。

示例 1:
输入:s = “00110”
输出:1
解释:我们翻转最后一位得到 00111.

示例 2:
输入:s = “010110”
输出:2
解释:我们翻转得到 011111,或者是 000111。

示例 3:
输入:s = “00011000”
输出:2
解释:我们翻转得到 00000000。

解题方法

动态规划
翻转字符串需要 n 个步骤,针对每一个字符又有两种选择,即翻转该字符和不翻转该字符,最终需要返回符合要求的最少翻转次数,所以本题可以使用动态规划解决。

在翻转下标为 i 的字符时假设它之前的前 i 个字符都已经按照规则翻转完毕,即符合题目所描述的递增。
定义两个状态 f0(i - 1) 和 f1(i - 1),表示前 i 个字符翻转后得到的递增字符串分别以 ‘0’ 和 ‘1’ 结尾时共所需的最小翻转次数。

对于 f0(i),即表示前 i + 1 个字符翻转后得到的递增字符串以 ‘0’ 结尾时共所需的最小翻转次数,那么此时前 i 个字符翻转后得到的字符串必须也以 ‘0’ 结尾才能符合递增的要求。另外如果当前字符为 ‘1’ 则需要进行一次翻转。

对于 f1(i),即表示前 i + 1 个字符翻转后得到的递增字符串以 ‘1’ 结尾时共所需的最小翻转次数,那么此时前 i 个字符翻转后得到的字符串以 ‘0’ 或者 ‘1’ 结尾均可,但是考虑到需要最少翻转次数,所以选择值较小者。
另外如果当前字符为 ‘0’ 则需要进行一次翻转。
综上所示,可以得到状态转移方程为

在这里插入图片描述

以上方程要求 i >= 1,那么对于 i = 0 时需要根据 s[0] 的情况进行初始化。
完整代码如下,时间复杂度为 O(n),空间复杂度为 O(1)。

class Solution
{
public:
    int minFlipsMonoIncr(string s) 
    {
        vector<vector<int>>dp(2, vector<int>(2, 0));
        s[0] == '0' ? dp[0][1] = 1 : dp[0][0] = 1;
        for (int i = 1; i < s.size(); ++i)
        {
            int prev0 = dp[(i - 1) % 2][0];
            int prev1 = dp[(i - 1) % 2][1];
            dp[i % 2][0] = prev0 + (s[i] != '0');
            dp[i % 2][1] = min(prev0, prev1) + (s[i] != '1');
        }

        int last = (s.size() - 1) % 2;
        return min(dp[last][0], dp[last][1]);
    }
};
LeetCode——1888. 使二进制字符字符交替的最少反转次数(Minimum Number of Flips to Make the Binary ...)[中等]——分析及代码(Java) LeetCode——1888. 使二进制字符字符交替的最少反转次数[Minimum Number of Flips to Make the Binary String Alternating][中等]——分析及代码[Java]一、题目二、分析及代码1. 滑动窗口(1)思路(2)代码(3)结果三、其他 一、题目 给你一个二进制字符串 s 。你可以按任意顺序执行以下两种操作任意次: 类型 1 :删除 字符串 s 的第一个字符并将它 添加 到字符串结尾。 类型 2 :选择 字符串 s 中任意一个字符并将该字符 阅读详情

相关推荐

使二进制字符字符交替的最少反转次数

一、问题 二、问题分析 这问题跟之前交换二进制字符串挺像的,刚开始想当然以为类型二和那个问题一样,结果后来仔细一看这道题要比那道的操作步骤简单多了。 问题抽象化:我们将字符串设为[1...n],现在的问题是求出这个字符串的最少变更次数。而第一步操作可以描述为:从[1...n]中选取[1...k]附加到[k+1...n]后面,即[k+1...n,1...k],我们发现中间部位[k+1...n]是不变的,而只有[1...k]的整体变动,然而这[1...k]的变动对[1...k]的转换次数并不会产生影响

wweTHEUT的博客 1058

最小翻转次数

Problem statement: 问题陈述: Given a binary string (containing only 0s and 1s). We need to make this string a sequence of alternate characters (0 and 1) by flipping some of the bits, our goal is to mini...

cumtb2009的博客 1425

深入解析Panfrost驱动:Mali-GPU开源驱动的架构与实现

本文深入解析了Panfrost驱动作为Mali-GPU开源驱动的架构与实现。从诞生背景到硬件架构演进,详细介绍了Panfrost如何突破ARM闭源策略,实现全栈支持。文章还探讨了驱动设计中的关键技术挑战与性能优化策略,为开发者提供了实用的编译部署指南和性能调优方法。

weixin_30790841的博客 516

51nod 2517 最少01翻转次数(c++实现)

小b有一个01序列,她每次可以翻转一个元素,即将该元素异或上1。 现在她希望序列不降,求最少翻转次数。 收起 输入 第一行输入一个数n,其中1≤n≤20000; 第二行输入一个由‘0’和‘1’组成的字符串 输出 输出一个非负整数,表示翻转次数 输入样例 6 010110 输出样例 2 在刚开始做这道题时,看到“序列不降“”想到的是找到第一个为1的字符,然后将后面为0的字符翻转为1,这种方法可以得到...

qq_43353709的博客 1085

栈与队列:leetcode 20.有效的括号、1047. 删除字符串中的所有相邻重复项、150.逆波兰表达式求值

c++ leetcode 栈刷题

qq_52097561的博客 111

day09-数据结构力扣

本文摘要: 本文介绍了栈、队列和双端队列的基本概念与操作,并给出了力扣经典题目的实现方案。主要内容包括:1) 栈的LIFO特性和基本操作,应用场景如函数调用、括号匹配等;2) 队列的FIFO特性及操作,应用于BFS、任务调度等;3) 双端队列的两端操作特性。重点解析了232题(栈实现队列)、225题(队列实现栈)、20题(有效括号)和1047题(删除相邻重复项)的解题思路和Python实现代码,详细说明了数据结构的转换逻辑和边界条件处理。

qq_64799801的博客 395

Leetcode 1047. 删除字符串中的所有相邻重复项

感觉如果不是因为在做栈专题,我可能跟都想不到要用栈来做,当然用栈来做确实就相当简单了。,这是个双向队列,这样我在返回答案的时候就不用再翻转一遍了。

JehanRio's Private Blog 168

力扣 1047删除字符串中的所有相邻重复项

用result接收mystack.top() 的元素,pop()仅弹出元素,通常与top配合使用。用栈来实现,遍历s,如果当前元素与栈顶元素相同,则弹栈,否则入栈。栈内剩下的元素全部弹栈,再翻转。代码方面:元素入栈的情况 if。不要写成mystack.pop。

weixin_43261508的博客 323

leetcode刷题/栈和队列 1047. 删除字符串中的所有相邻重复项

1047. 删除字符串中的所有相邻重复项 题意: 给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。 在 S 上反复执行重复项删除操作,直到无法继续删除。 在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。 示例: 输入:"abbaca" 输出:"ca" 解释: 例如,在 "abbaca" 中,我们可以删除 "bb" 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 "aaca",其中又只有 "aa" 可以执行重复项删除操作,所以

公仔面 311

HDU1047 Integer Inquiry——多个长整数求和

点这里 题意: T组数据,每组数据都有多个不超过一百位的长整数,每组数据以0结尾,输出所有长整数求和结果,没两组输出之间要空行。 题解: 一开始想到了string的反转函数,写了一下是比较简单的,但是TLE了。无奈回归到数组来做,每个整数输入之后要翻转过来求和,最后再反转过来输出。一些细节没处理好,废了点时间。 #include<iostream> #include<algorithm> #include<cstring> using namespace s...

lllllan 176

1047.删除字符串中的相邻重复项

先将字符串转为字符数组 第一个元素先进栈 循环这个字符数组与栈中元素比较 如果相等则将栈中元素出栈 不相等则入栈 循环完栈中元素出栈得到删除后的逆序字符串 最后循环得到删除后的正序字符串并且返回 class Solution { public String removeDuplicates(String s) { char[] a=s.toCharArray(); Deque<Character> stack=new LinkedList()

yizhishuangsheng的博客 538

杭电1047

题目描述: 不描述了,和那些大数相加一样吧,注意格式 AC代码: #include #include #define N 105 void add(char a[],char b[],char c[]){ int i,e,d; int n,m; char temp; n=strlen(a); m=strlen(b); for(i=0; i<n/

何彬的博客 989

代码随想录二刷-删除字符串中的所有相邻重复项

例如,在 “abbaca” 中,我们可以删除 “bb” 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 “aaca”,其中又只有 “aa” 可以执行重复项删除操作,所以最后的字符串为 “ca”。原因是栈是先进后出。1.给出由小写字母组成的字符串S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。b. 也就是说,如果当前字母为b,下个字母还是b的话,就要将b删除。a. 题目要求的是把重复项删除后的字符串,删除操作的对象是。b. 遍历字符串,遇到重复项,把重复项出栈。

Bryant_cqc的博客 1349

力扣(字符串):942、344、557、806、1047

一、942 思路: 我们首先考虑字符串中的第一个字母。如果 S[0] == 'I',那么我们只要令 A[0] = 0,就一定能满足 A[0] < A[1]。如果 S[0]== 'D',同样我们只要令 A[0] = N,就一定能满足 A[0] > A[1]。 接下来,当我们考虑 S 中剩下的 N - 1 个字母时,还剩下 N 个数可以使用,这 N 个数为 [0 .. N ...

du_lijun的博客 569

代码随想录算法训练营第十一天 | LeetCode 20. 有效的括号、LeetCode 1047. 删除字符串中的所有相邻重复项、LeetCode 150. 逆波兰表达式求值

【代码】代码随想录算法训练营第十一天 | LeetCode 20. 有效的括号、LeetCode 1047. 删除字符串中的所有相邻重复项、LeetCode 150. 逆波兰表达式求值。

Hsusan的博客 292

[leetcode]做题记录1047删除字符串中的所有相邻重复项

用栈做,先遍历字符串,把每个字符放入栈中,判断遍历到的字母与前面的是否重复,不重复放入栈中,重复就将栈顶去除。最后用一个新的字符串接受删除后的字符串 然后翻转一下即可。

weixin_49157161的博客 170

代码随想录Day10-LeetCode 20 & 1047 & 150

思想:找到3种不匹配的情况,利用栈结构,剪纸操作,模2≠0,报错。思想:后序遍历能直接运算,而中序遍历有括号干扰。方法一:利用栈进行操作,最后对栈进行翻转。方法二:拿字符串直接作为栈。

weixin_45830552的博客 88

leetcode20. 有效的括号、1047. 删除字符串中的所有相邻重复项、150. 逆波兰表达式求值

遍历字符串,把字符一个一个放进栈中,如果要放进去的字符与栈顶相同,删除,最后再把栈里的字符取出来(记得翻转)解释:该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9。实际上,这个是算式 2 + 4 * ( 5 - 2 ) 的波兰表达式。输入:tokens = [“2”,“1”,“+”,“3”,“*”]我们也可以直接把结果字符串作为栈,这样还能省去翻转的操作。那我们分析的三种情况,分别对应栈的什么情况呢?首先了解一下波兰表达式:波兰表达式。,算完再放回去,最后弹出结果即可。

qq_68664071的博客 293

(第18天)【leetcode题解】20、有效的括号 1047、删除字符串中的所有相邻重复项 150、逆波兰表达式求值

栈可以用来进行括号匹配。栈可以用来相邻重复项匹配。用栈匹配的机制为相邻元素的匹配。特定情况下,可以用string字符串来作为栈进行匹配,因为它具有栈先入后出特性相对应的操作:访问栈顶元素、入栈、出栈。针对不同的问题,选择合适的数据结构有利于高效地解决问题。栈适用于计算机的递归操作和后缀表示法运算。

m0_73755059的博客 1398

【滤波跟踪】多雷达协同下的多目标跟踪:航迹管理优化与卡尔曼滤波融合策略

本文深入探讨了多雷达协同下的多目标跟踪技术,聚焦于航迹管理优化与卡尔曼滤波融合策略两大核心。通过分析分布式融合架构、航迹关联算法(如匈牙利算法)以及应对非线性与机动目标的扩展卡尔曼滤波(EKF)与无迹卡尔曼滤波(UKF)等方法,旨在解决多源信息融合难题,提升复杂环境下目标跟踪的精度与鲁棒性。

weixin_29214199的博客 255

SLAM数据集分享[代码]

本文分享了多个SLAM相关数据集,包括TUM数据集(RGB-D、VIO、单目)、EUROC数据集(双目+IMU)、KITTI数据集(灰度序列、彩色序列、激光序列)、TartanAir数据集和ICL-NUIM数据集。针对国内网络下载缓慢的问题,作者提供了百度网盘的下载链接和提取码,方便读者快速获取。此外,文章还简要介绍了各数据集的特点和使用方法,并提供了相关参考资料。这些数据集对于SLAM研究和开发具有重要价值,能够帮助研究者更好地进行算法验证和性能评估。

上一篇: 1046-最小时间差
下一篇: 1048-语法制导翻译(1)
林林林ZEYU
博客等级 码龄6年 1387粉丝 · 1052原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林林林ZEYU

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值