LC926. 将字符串翻转到单调递增(JAVA - 动态规划)

2023-09-22 15:52:34

将字符串翻转到单调递增

题目描述

难度 - 中等
LC926. 将字符串翻转到单调递增(JAVA - 动态规划)

如果一个二进制字符串,是以一些 0(可能没有 0)后面跟着一些 1(也可能没有 1)的形式组成的,那么该字符串是 单调递增 的。
给你一个二进制字符串 s,你可以将任何 0 翻转为 1 或者将 1 翻转为 0 。
返回使 s 单调递增的最小翻转次数。

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

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

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

提示:
1 <= s.length <= 10^5
s[i] 为 ‘0’ 或 ‘1’

在这里插入图片描述

动态规划

单调递增的字符串满足以下性质:
1.首个字符是 0 或 1;
2.其余的每个字符,字符 0 前面的相邻字符一定是 0,字符 1 前面的相邻字符可以是 0 或 1。

我们用动态规划去解答这个题时,每个位置我们都要考虑,其变成0或者1,的情况,最后我们取改变最小的值,

当 1≤i<n 时,考虑下标 i 处的字符。如果下标 i 处的字符是 0,则只有当下标 i−1 处的字符是 0 时才符合单调递增;如果下标 i 处的字符是 1,则下标 i−1 处的字符是 0 或 1 都符合单调递增,此时为了将翻转次数最小化,应分别考虑下标 i−1 处的字符是 0 和 1 的情况下需要的翻转次数,取两者的最小值。

代码演示:

class Solution {
     public int minFlipsMonoIncr(String s) {
        int n = s.length();
        int dp0 = 0;
        int dp1 = 1;
        for(int i = 0; i < n;i++){
            char c = s.charAt(i);
            int newDp0 = dp0;
            int newDp1 = Math.min(dp0,dp1);
            if(c == '1'){
                newDp0++;
            }else{
                newDp1++;
            }
            dp0 = newDp0;
            dp1 = newDp1;
        }

        return Math.min(dp0,dp1);
     }
      

}
更多推荐

聊聊API安全的重要性及治理思路

在应用程序开发过程中,API是一个会被经常提及的东西,它的全称是ApplicationProgrammingInterface(应用程序接口),一般指的是WebAPI,即:采用HTTP通信协议的API或者是Web应用程序对外提供的API。API从狭义上可以理解为是一种服务能力,调用方可以利用API很便捷的得到一组相关数

竞赛选题 基于深度学习的植物识别算法 - cnn opencv python

文章目录0前言1课题背景2具体实现3数据收集和处理3MobileNetV2网络4损失函数softmax交叉熵4.1softmax函数4.2交叉熵损失函数5优化器SGD6最后0前言🔥优质竞赛项目系列,今天要分享的是🚩**基于深度学习的植物识别算法**该项目较为新颖,适合作为竞赛课题方向,学长非常推荐!🥇学长这里给一

阿里云无影云电脑角色AliyunServiceRoleForGws什么意思?

阿里云无影云电脑服务关联角色是指角色名称:AliyunServiceRoleForGws,并赋予角色权限策略:AliyunServiceRolePolicyForGws的过程,简单来说,就是允许无影云电脑服务访问您VPC、CEN和NAS中的资源,使用该权限查询实例,管理无影云电脑办公网络。创建无影云电脑之前需要先为无影

ELK 企业级日志分析系统

目录1、ELK概述1.1ELK简介1.2为什么要使用ELK1.3完整日志系统基本特征1.4ELK的工作原理2、ELKElasticsearch集群部署(在Node1、Node2节点上操作)2.1环境准备2.2部署Elasticsearch软件2.3安装Elasticsearch-head插件3、ELKLogstash部

【QT】day2

1.完善登录框点击登录按钮后,判断账号(admin)和密码(123456)是否一致,如果匹配失败,则弹出错误对话框,文本内容“账号密码不匹配,是否重新登录”,给定两个按钮ok和cancel,点击ok后,会清除密码框中的内容,继续进行登录;如果点击cancel按钮,则关闭界面。如果账号和密码匹配,则弹出信息对话框,给出提

spring 拦截器

Spring拦截器是在处理请求的过程中,可以在特定的时机对请求进行一些处理,比如记录日志、进行权限校验、统计请求时间等。实现步骤:创建一个拦截器类,实现HandlerInterceptor接口,并重写其方法。在Spring配置文件中添加拦截器配置,可以配置拦截的URL,也可以对所有URL进行拦截。在拦截器的方法中编写拦

API(十)时间相关的SDK

一时间相关的SDK①时间记录的必要性1、'案发'现场的时间点2、通过时间判断'性能'3、时间的'不准确'性,日志'落盘'时间-->'缓冲区'导致延迟②使用哪些日期和时间的函数1、lua标准'时间'函数,函数'os.time'、'os.date'和'os.difftime'提供了所有日期和时间2、在openresty的世

vue3硅谷甄选01 | 使用vite创建vue3项目及项目的配置 环境准备 ESLint配置 prettier配置 husky配置 项目集成

文章目录使用vite创建vue3项目及项目的配置1.环境准备2.项目配置ESLint校验代码工具配置-js代码检测工具1.安装ESLint到开发环境devDependencies2.生成配置文件:`.eslint.cjs`**3.安装vue3环境代码校验插件**4.修改.eslintrc.cjs配置文件5.生成ESLi

接口自动化测试框架搭建全部过程

思想:1、基本目录的搭建report:静态输出目录(报告或者日志)data:静态输入目录(可以存放Excel数据,被读取的一些数据)utils:实用方法层(这里存放的是项目的公共方法,一般拿到别的项目可以直接使用,列如:读取Excel中的数据,连接数据库,)apis:接口请求层(这里封装的方法一般都是和项目有关系,列如

MySQL 权限分配

有时候,您需要查看某个用户被授予的权限以便复核。MySQL允许您使用SHOWGRANTS语句来显示分配给用户帐户或角色的权限。MySQLSHOWGRANTS语句介绍以下是SHOWGRANTS语句的基本语法:SHOWGRANTS[FOR{user|role}[USINGrole[,role]...]]在这个语法中:首先,

记录一次DLL分析实战

记录一次DLL分析实战1.VT查看分析报告2.判断文件是否加壳3.查看导入函数4.查看是否有任何其他文件或基于主机的迹象5.使用工具IDAPro进行字符串分析1.VT查看分析报告virustotal全绿,没有报毒:可以看到这个dll是32位的:下面可以看它调用的其他dll:以及它对外提供的函数接口:其中RunCmd很可

热文推荐