java数据结构与算法刷题-----LeetCode696. 计数二进制子串

news2024/11/22 8:52:49
java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846

文章目录

    • 1. 法一:时间复杂度O(n).空间复杂度O(n)
    • 2. 法二:时间复杂度O(n).空间复杂度O(1)
    • 2. 法三:时间复杂度O(n).空间复杂度O(1)

在这里插入图片描述

1. 法一:时间复杂度O(n).空间复杂度O(n)

解题思路

因为字符串只有0和1两个字符,所以我们可以对字符串进行分组

  1. 假设有00011100000111这样一个字符串,我们记录每次字符出现次数
  2. 0出现3次,1出现3次,0有出现5次,1又出现3次
  3. 题目要求我们只要0和1相邻,然后数量一致即可

两个相邻的连续串,比如0001111,这里0有3个,1有4个,题目要求连续且0和1个数相等
那么只能000111.0011,01.正好可以由3种不同0的数量,组成答案。也就是谁少听谁的

代码

在这里插入图片描述

class Solution {
    public int countBinarySubstrings(String s) {
        List<Integer> counts = new ArrayList<Integer>();//分组
        int ptr = 0, n = s.length();//ptr为下标,
        while(ptr < n){//如果还有字符串可遍历
            char c = s.charAt(ptr);//获取当前字符
            int count = 0;//记录当前字符连续出现的个数
            while(ptr < n && s.charAt(ptr) == c){//如果当前字符连续出现
                ptr++;count++;//下标后移,count++
            }
            counts.add(count);//当字符连续性中断时,记录当前字符出现次数
        }
        int ans = 0;//输出答案
        //两个相邻的连续串,比如0001111,这里0有3个,1有4个,题目要求连续且0和1个数相等
        //那么只能000111.0011,01.正好可以由3种不同0的数量,组成答案。也就是谁少听谁的
        for(int i = 1;i<counts.size();i++)
            ans += Math.min(counts.get(i), counts.get(i-1));
        return ans;
    }
    
}

2. 法二:时间复杂度O(n).空间复杂度O(1)

解题思路

法一使用了额外的List存储字符串0和1的分组信息。接下来我们将其优化掉,用一个滚动变量来代替List

代码

在这里插入图片描述

class Solution {
    public int countBinarySubstrings(String s) {
        int ptr = 0, n = s.length(), last = 0, ans = 0;//ptr为下标,last为滚动变量,ans保存答案
        while (ptr < n) {//只要有字符可遍历就继续
            char c = s.charAt(ptr);//获取当前字符
            int count = 0;//对本次字符,进行连续个数统计
            while (ptr < n && s.charAt(ptr) == c) {
                ++ptr;
                ++count;
            }
            ans += Math.min(count, last);//ans直接进行处理。而不是存储到List中最后统一处理
            last = count;//滚动变量继续滚动
        }
        return ans;
    }
}

2. 法三:时间复杂度O(n).空间复杂度O(1)

解题思路

对法二进一步优化流程,每次循环,少了很多条件判断,实际意义不大,仅仅能快个1到2毫秒而已。但是如果你追求超越100%的其它用户,可以尝试。

代码

在这里插入图片描述

class Solution {
    public int countBinarySubstrings(String s) {
        char a[] = s.toCharArray();//获取数组
        char last = a[0];//当前分组的第一个字符
        int preCount = 0, curCount = 1;//preCount表示上一个字符出现的次数,curCount的当前字符last的出现次数
        int res = 0;//res保存最终答案
        for (int i = 1, n = s.length(); i < n; i++) {//遍历字符串
            char c = a[i];//获取字符
            if (last != c) {//如果当前字符和第一个last保存的字符不一致了,就说明当前分组统计完成
                res += Math.min(preCount, curCount);//preCount和curCount谁小听谁的
                preCount = curCount;//preCount变为当前curCount,理解为后移操作
                curCount = 0;//cur重新计算下一个last的出现次数
                last = c;//last后移
            }
            curCount++;//如果当前字符和last一致,cur++
        }
        res += Math.min(preCount, curCount);//最终还得额外保存一次
        return res;
    }
}    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1452391.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++ QT项目2】——高仿安信可串口调试助手

【C QT项目2】——高仿安信可串口调试助手 1. 项目概述2. 项目UI设计3. 串口通信核心代码开发3.1 QSerialPort介绍及示例3.2 扫描系统串口3.3 数据的收发3.4 定时发送&#xff08;QT定时器&#xff09;3.5 HEX显示与发送 4. 串口调试助手功能的优化4.1 串口的实时扫描4.2 获取系…

skimage库简介

scikit-image 是专注于图像处理的Python包&#xff0c;全称是scikit-image SciKit。该包由python语言编写&#xff0c;由scipy 社区开发和维护&#xff0c;使用原生的Numpy数组作为图像对象。 一、skimage简介 skimage&#xff08;scikit-Image&#xff09;是基于python开发的…

petalinux安装

跟着正点原子文档安装的&#xff0c;记录一下 1. 安装包下载 xilinx官网&#xff08;没有注册需要注册&#xff0c;注册比较慢&#xff0c;嫌弃耽搁时间直接用正点原子网盘里下好的&#xff09; https://china.xilinx.com/support/download/index.html/content/xilinx/zh/dow…

人工智能学习与实训笔记(十四):Langchain Agent

0、概要 Agent是干什么的&#xff1f; Agent的核心思想是使用语言模型&#xff08;LLM&#xff09;作为推理的大脑&#xff0c;以制定解决问题的计划、借助工具实施动作。在agents中几个关键组件如下&#xff1a; Agent&#xff1a;制定计划和思考下一步需要采取的行动。Tools…

拿捏单链表

目录 引言 一&#xff1a;链表的定义 二&#xff1a;单链表的定义 三&#xff1a;单链表的增删查改 1.单链表增删查改及遍历的声明 注&#xff1a;在测试中创建指向头结点的指针plist 2.二级指针应用的说明 3.单链表的遍历 4.创建节点 5.单链表的插入 (1)头插 …

【深度学习:DICOM 注释工具】在 DICOM 注释工具中寻找的 7 个功能

【深度学习&#xff1a;DICOM 注释工具】在 DICOM 注释工具中寻找的 7 个功能 原生 DICOM 支持原生 3D 注释易于使用的界面DICOM 图像的自动注释质量控制功能审计跟踪SOC2 和 HIPAA 合规性 如果您尝试为医疗 AI 模型创建训练数据&#xff0c;您可能已经使用了免费的开源工具&am…

html从零开始9:javaScript简介,语句、标识符,变量,JavaScript引入到文件【搬代码】

javaScript简介 javaScript语句、标识符 变量 var num 10; var就是固定声明,num就是变量名&#xff0c;10就是变量&#xff1b;<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Comp…

【pyopenGL编程手册- 01/20】pyopenGL安装和简要说明

目录 一、说明二、测试系统安装的健康性三、安装64位的openGL四、写给程序员的4. 1 函数库介绍4.2 库内函数的命名 五、常见库的函数介绍5.1 OpenGL 核心库 GL5.2 OpenGL 实用库 GLU5.3 OpenGL 工具库 GLUT5.4 Windows 专用库 WGL 六、错误引发点和异常追踪6.1 错误检查开关6.…

人工智能学习与实训笔记(五):神经网络之推荐系统处理

目录 ​​​​​​​七、智能推荐系统处理 7.1 常用的推荐系统算法 7.2 如何实现推荐​​​​​​​ 7.3 基于飞桨实现的电影推荐模型 7.3.1 电影数据类型 7.3.2 数据处理 7.3.4 数据读取器 7.3.4 网络构建 7.3.4.1用户特征提取 7.3.4.2 电影特征提取 7.3.4.3 相似度…

TenorFlow多层感知机识别手写体

文章目录 数据准备建立模型建立输入层 x建立隐藏层h1建立隐藏层h2建立输出层 定义训练方式建立训练数据label真实值 placeholder定义loss function选择optimizer 定义评估模型的准确率计算每一项数据是否正确预测将计算预测正确结果&#xff0c;加总平均 开始训练画出误差执行结…

C++初阶(十一) list

一、list的介绍及使用 1.1 list的介绍 list的文档介绍 1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。 2. list的底层是双向链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xff0c;在节点…

爱上JVM——常见问题(一):JVM组成

1 JVM组成 1.1 JVM由那些部分组成&#xff0c;运行流程是什么&#xff1f; 难易程度&#xff1a;☆☆☆ 出现频率&#xff1a;☆☆☆☆ JVM是什么 Java Virtual Machine Java程序的运行环境&#xff08;java二进制字节码的运行环境&#xff09; 好处&#xff1a; 一次编写&…

巨抽象的前端vue3

根据实践证明&#xff0c;越是简单的问题&#xff0c;越容易造成大bug 一个自定义组件的路径就废了我老半天了 各种查询&#xff0c;各种百度&#xff0c;各种问&#xff0c;结果规规矩矩去导入组件路径&#xff0c;成了&#xff01; 错误代码&#xff1a; <script setu…

canal监听binlog记录业务数据的变更;canalAdmin对instance做web配置

概述 平时在开发中会通过logback打印一些开发日志&#xff0c;有时也会需要记录一些业务日志&#xff0c;简单的就直接用log记录一下&#xff0c;但是系统中需要记录日志的地方越来越多时&#xff0c;不能每个地方都写一套log记录&#xff1b; 由于平常用的大多都是mysql&…

c语言遍历文件夹中的文件

文件目录如下&#xff0c;文件夹里还有一些txt文件未展示出来。 使用递归实现&#xff0c;深度优先遍历文件夹中的文件。 代码如下&#xff0c;用了一点C的语法。 #include <io.h> #include <iostream> using namespace std;#define MAX_PATH_LENGTH 100int Tr…

创新技巧|迁移到 Google Analytics 4 时如何保存历史 Universal Analytics 数据

Google Universal Analytics 从 2023 年 7 月起停止收集数据&#xff08;除了付费 GA360 之外&#xff09;。它被Google Analytics 4取代。为此&#xff0c;不少用户疑惑&#xff1a;是否可以将累积&#xff08;历史&#xff09;数据从 Google Analytics Universal 传输到 Goog…

@ControllerAdvice 的介绍及三种用法

ControllerAdvice 的介绍及三种用法 浅析ControllerAdvice 首先&#xff0c;ControllerAdvice本质上是一个Component&#xff0c;因此也会被当成组建扫描&#xff0c;一视同仁&#xff0c;扫扫扫。 然后&#xff0c;我们来看一下此类的注释&#xff1a; 这个类是为那些声明了&…

智胜未来,新时代IT技术人风口攻略-第四版(弃稿)

文章目录 前言鸿蒙生态科普调研人员画像高校助力鸿蒙高校鸿蒙课程开设占比教研力量并非唯一原因 企业布局规划全盘接纳仍需一段时间企业对鸿蒙的一些诉求 机构入场红利机构鸿蒙课程开设占比机构对鸿蒙的一些诉求 鸿蒙实际体验高校用户群体高度认同与影响体验企业用户群体未来可…

【数据分享】2001~2020年青藏高原植被净初级生产力数据集

各位同学们好&#xff0c;今天和大伙儿分享的是2001~2020年青藏高原植被净初级生产力数据集。如果大家有下载处理数据等方面的问题&#xff0c;您可以私信或评论。 朱军涛. (2022). 青藏高原植被净初级生产力数据集&#xff08;2001-2020&#xff09;. 国家青藏高原数据中心. …

基于STM32的老人心率监测系统

1. 系统设计 本次课题为基于STM32的老人心率监测系统&#xff0c;在此设计了如图2.1所示的系统结构框图&#xff0c;整个系统包括了MAX30102心率血氧检测模块&#xff0c;SIM800短信模块&#xff0c;液晶显示模块&#xff0c;按键&#xff0c;ESP8266无线通信模块以及主控制器s…