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

Java语言程序设计与数据结构第一章编程题 立即下载
java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.youkuaiyun.com/grd_java/article/details/123063846

在这里插入图片描述

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;
    }
}    
JAVA语言程序设计与数据结构课后 编程题解析 立即下载

相关推荐

笔面试常考算法—数据结构篇(java版)

java实现的历年来有关数据结构方面的常考算法,包含线性表、栈、树、图等,内含示例,使用Java原生sdk实现。

数据结构(JAVA)—代码题

01-02-03。

zyx210603的博客 749

Java数据结构题

Java数据结构题

数据结构练习题——Java实现

数据结构练习题

Yuan_o_的博客 618

Java语言程序设计与数据结构第三章编程题.zip

Java语言程序设计与数据结构第三章编程题.zip

STM32F407编译下载全流程:从CubeMX到HEX烧录

嵌入式固件开发中,编译与下载是连接代码与硬件的关键闭环。其本质是将高级语言描述的逻辑,经交叉编译(ARM GCC)、链接(ELF生成)、格式转换(HEX/BIN)后,通过调试接口(SWD/UART)写入MCU Flash存储器的过程。该流程涉及工具链协同、二进制格式特性(如Intel HEX的地址映射与无元数据设计)、启动模式(System Memory Bootloader)、Flash选项字节(RDP/WRP)等底层机制,直接决定固件可运行性与安全性。典型应用场景包括STM32F407开发板调试、量产固

weixin_28840811的博客 260

数据结构(Java)——数组(例题)

知识点:前缀和。

2302_78245266的博客 1385

docker配置国内镜像源

【代码】docker配置国内镜像源。

愿听风成曲 9616

数据结构2

数据结构与算法 1.什么是算法? 2.TreeMap和TreeSet在排序时如何比较元素?Collections工具类中的sort()方法如何比较元素? 3.如何知道二叉树的深度? 4.介绍一下,堆排序的原理是什么? 5.数组和链表的区别 6.二分查找了解过吗? 7.说下你熟悉的排序算法 8.布隆过滤器了解过吗? 9.一致性hash算法了解过吗? 10.如何在一个1到100的整数数组中找到丢失的数字? 11.请你讲讲LRU算法的实现原理? 12.为什么要设计后缀表达式,有什么好处? 13. 什么是B树?

Captain_He的博客 1389

不同网段共享打印机的方法

不同网段怎么共享打印机,跨路由怎么共享打印机

weixin_44686104的博客 1万+

新手必看:瑞萨MCU选型时,QFP、QFN、BGA这些封装到底该怎么选?(附选型避坑指南)

本文详细解析了瑞萨MCU选型中QFP、QFN、BGA等封装的特点与适用场景,提供实战避坑指南。通过对比封装的空间占用、散热能力、焊接难度等核心维度,帮助工程师根据具体需求选择最合适的芯片封装,避免因选型不当导致的高成本与生产问题。

weixin_26965807的博客 421

java数据结构与算法面试题汇总

快速排序是一种高效的排序算法,它采用分治的思想,通过选择一个基准元素,将数组分为两部分,小于基准元素的部分和大于基准元素的部分,然后分别对这两部分进行递归排序。插入排序是一种简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。冒泡排序是一种简单的排序算法,它重复地遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。给定两个单链表,判断它们是否有交点,如果有,返回交点的节点。反转一个单链表,即将链表的节点顺序反转。

m0_57836225的博客 2598

VPS环境搭建及配置

VPS(Virtual Private Server)是一种虚拟化技术,可以将一台物理服务器分成多个虚拟服务器,每个虚拟服务器都有独立的操作系统和资源,相互之间互不影响。VPS可以提供类似于独立服务器的功能,但价格更便宜,适合中小企业和个人用户使用。VPS可以用于网站托管、应用程序部署、游戏服务器、数据备份等各种场景。

YJ_12340的博客 1万+

leetcode-696 计数二进制子串 java语言

letcode 1 【随记letcode编程史】 计数二进制子串 (696) 主体思想:首先,求出字符串所有的子串;然后根据题目中的限制条件对所有子串逐一判断,对符合要求的子串进行累加。最后输出符合要求的子串次数count。 对子串的判断条件是:首先分别统计0和1的个数。然后当两者个数相同时,再进一步根据“1”和“0”的位置进行判断,符合条件变累加。 import java.util.Scanner; /** * 696、给定一个字符串 s,计算具有相同数量0和1的非空(连续)子字符串的数量,

偶来小歇 409

激光雷达与相机融合(四)----基于激光雷达与相机的碰撞检测

在这一部分,基于前面的各个部分内容,将利用激光雷达和相机实现目标的检测分类及单目标跟踪,并对车辆前方的车辆目标计算相应的碰撞时间TTC。计算方法分别利用相机和雷达实现。 1.系统的总体架构: 2.TTC计算 简单介绍一下通过激光雷达和相机计算碰撞时间的原理: 利用激光雷达点计算碰撞时间:首先根据检测框聚类出前车目标的点,并过滤掉这些点中的离群点,然后找出这些点中相对于本车最近的点,基于前后两帧以及数据采集频率就可以求解出相对速度,然后用当前帧的距离除以速度得出当前的TTC。但该方法对最近点的选取稳定性不是

张飞飞的博客 3987

告别过热焦虑:用Ansys Icepak给你的电子设备做个“水冷体检”(附冷板案例全流程)

本文详细介绍了如何利用Ansys Icepak进行电子设备水冷系统的热仿真分析,帮助工程师解决设备过热问题。通过冷板案例全流程演示,展示了从几何处理、材料设定到求解器设置和后处理的关键步骤,提升散热设计效率与准确性。

weixin_29299807的博客 441

「算法」LeetCode 696. 计数二进制子串(JavaScript版)

题目链接:https://leetcode-cn.com/problems/count-binary-substrings/ 这道题目前我有两种解题思路,如果别的小伙伴还有更好的思路或是觉得我的思路不正确,欢迎大家在评论区提出来~ 解法1: export default (str) =&gt; { let r = []; let match = (str) =&gt; { ...

Jack's Blog 3499

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

LeetCode【每日一题】_696. 计数二进制子串_java

696. 计数二进制子串问题描述题解种子搜索分割字符左右迭代 问题描述 696.计数二进制子串 给定一个字符串 s,计算具有相同数量0和1的非空(连续)子字符串的数量,并且这些子字符串中的所有0和所有1都是组合在一起的。 重复出现的子串要计算它们出现的次数。 示例 1 : 输入: "00110011" 输出: 6 解释: 有6个子串具有相同数量的连续1和0:“0011”,“01”,“1100”,“10”,“0011” 和 “01”。 请注意,一些重复出现的子串要计算它们出现的次数。 另外,“001100

weixin_48598155的博客 253

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

数据结构与算法之字符串: LeetCode 696. 计数二进制子串 (Ts, Py, Go, Java版)

给定一个字符串 s,统计并返回具有相同数量 0 和 1 的非空(连续)子字符串的数量,并且这些子字符串中的所有 0 和所有 1 都是成组连续的。重复出现(不同位置)的子串也要统计它们出现的次数。

Wang的专栏 1103

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

LeetCode 696. 计数二进制子串

1. 题目 给定一个字符串 s,计算具有相同数量0和1的非空(连续)子字符串的数量,并且这些子字符串中的所有0和所有1都是组合在一起的。 重复出现的子串要计算它们出现的次数。 示例 1 : 输入: "00110011" 输出: 6 解释: 有6个子串具有相同数量的连续1和0:“0011”,“01”,“1100”,“10”,“0011” 和 “01”。 请注意,一些重复出现的子串要计算它们出现的次数...

Michael是个半路程序员 946

[LeetCode]696. 计数二进制子串(java实现)

[LeetCode]696. 计数二进制子串(java实现)1. 题目2. 读题(需要重点注意的东西)3. 解法4. 可能有帮助的前置习题5. 所用到的数据结构与算法思想6. 总结 1. 题目 2. 读题(需要重点注意的东西) 本题的思路难,但实现简单,现对思路进行分析如下: 子串里的0、1都要是连续且分布于字符串两边,如00001111,如00110011这样交叉是不行的 s = “00110011”—> 2 2 2 2 ,这里两个相邻的数一定代表的是两种不同的字符的个数;若s = "11100

cloud的博客 135

leetcode刷题记录

刷题过程记录

洪肥肥的博客 2063

LeetCode刷题系列 -- 696. 计数二进制子串

题目: 给定一个字符串s,计算具有相同数量0和1的非空(连续)子字符串的数量,并且这些子字符串中的所有0和所有1都是组合在一起的。 重复出现的子串要计算它们出现的次数。 示例 1 : 输入: "00110011" 输出: 6 解释: 有6个子串具有相同数量的连续1和0:“0011”,“01”,“1100”,“10”,“0011” 和 “01”。 请注意,一些重复出现的子串要计算它们出现的次数。 另外,“00110011”不是有效的子串,因为所有的0(和1)没有组合在一起。 示例 2 : 输入.

qq_33775774的博客 261

[LeetCode-Java] 696.计数二进制子串

计数二进制子串 题目 给定一个字符串 s,计算具有相同数量0和1的非空(连续)子字符串的数量,并且这些子字符串中的所有0和所有1都是组合在一起的。 重复出现的子串要计算它们出现的次数。 示例 1 : 输入: “00110011” 输出: 6 解释: 有6个子串具有相同数量的连续1和0:“0011”,“01”,“1100”,“10”,“0011” 和 “01”。 请注意,一些重复出现的子串要计算它们出现的次数。 另外,“00110011”不是有效的子串,因为所有的0(和1)没有组合在一起。 示例 2 : 输入

qq_42459832的博客 177

LeetCode 696 c# Edition(版本)

LeetCode 696      Count Binary Substrings(本人专注于刷leetcode全部题c#语言算法,后期发视频教程)  相信有些人看到这道题目的时候不会一下子明白。首先解释一下题意:    理解/核心:         1、连续的  2、数量相等    图解:   一定要记住是连续的0和1,而不是0011 和1100 对比是一组结果。如下图:数量相等每一组结果都是偶...

us2019的博客 353
上一篇: java数据结构与算法刷题-----LeetCode647. 回文子串
下一篇: java数据结构与算法刷题-----LeetCode1047. 删除字符串中的所有相邻重复项
ydenergy_殷志鹏
博客等级 码龄7年 5887粉丝 543原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

ydenergy_殷志鹏

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

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

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

打赏作者

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

抵扣说明:

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

余额充值