这是悦乐书的第293次更新,第311篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第161题(顺位题号是696)。给定一个字符串s,计算具有相同数字0和1的非空且连续子串的数量,并且这些子串中的所有0和所有1都是连续的。重复出现的子串也计算在内。例如:

输入:“00110011”

输出:6

说明:有6个子串具有相同数量的连续1和0:“0011”,“01”,“1100”,“10”,“0011”和“01”。其中一些子字符串重复出现了,但是也需要计算它们出现的次数。此外,“00110011”不是有效的子字符串,因为所有0(和1)都没有组合在一起。



输入:“10101”

输出:4

说明:有4个子串:“10”,“01”,“10”,“01”具有相同数量的连续1和0。



注意:

  • 字符串长度将介于1到50,000之间。

  • s只包含“0”或“1”字符。

本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

02 第一种解法

题目的意思是在给定的字符串中找到连续的0和1组成的子串个数,其中0和1是挨着的,可以有多个连续的0与多个连续的1。比如,0011,其中就有两个子串符合,一是第二位与第三位组成的01,二是其本身,两个0和两个1。再比如00111,同样也只有两个子串符合,一是01,二是0011。所以,我们的判断标准就变成了,在一个由0和1组成的连续子串中,0的个数与1的个数,取其中的较小值,就是可能的子串数。

对此,我们将原字符串中,将每段连续的0或者1的个数统计出来,然后比较相邻的两段的值,取其中较小的进行累加,最后就是该字符串所有可能的子串数。

此解法的时间复杂度是O(n),空间复杂度是O(n)。

public int countBinarySubstrings(String s) {
int[] arr = new int[s.length()];
arr[0] = 1;
int index = 0;
for (int i=1; i<s.length(); i++) {
if (s.charAt(i) != s.charAt(i-1)) {
arr[++index] = 1;
} else {
arr[index]++;
}
}
int count = 0;
for (int i=1; i <= index; i++) {
count += Math.min(arr[i], arr[i-1]);
}
return count;
}

03 第二种解法

第一种解法中,我们将每段分组的值存到了新数组中,在分段完后,再去计算总数,但是我们也可以不使用新数组,直接在统计分段时,就将值累加起来。我们使用两个临时变量,一个存储当前这段分组的长度,一个存储上一段分组的长度,在循环字符串中的字符时,如果当前字符和前一个字符不相等,说明该分段了,此时需要先比较两个临时变量的值,取较小的累加到count上去,然后将上一段的长度赋值给另外一个变量,当前新段的长度重置为1。在循环结束后,还需要再取两者之间的较小值再累加一次,因为有可能最后一段就是连续的,而不能在循环里进行判断了。

public int countBinarySubstrings(String s) {
int currentLength = 1, prevLength = 0, count = 0;
for (int i=1; i<s.length(); i++) {
if (s.charAt(i) != s.charAt(i-1)) {
count += Math.min(prevLength, currentLength);
prevLength = currentLength;
currentLength = 1;
} else {
currentLength++;
}
}
count += Math.min(prevLength, currentLength);
return count;
}

04 小结

算法专题目前已日更超过四个月,算法题文章161+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

LeetCode算法题-Count Binary Substrings(Java实现)的更多相关文章

  1. LeetCode算法题-Count Primes(Java实现)

    这是悦乐书的第190次更新,第193篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第49题(顺位题号是204).计算小于非负数n的素数的数量.例如: 输入:10 输出:4 ...

  2. LeetCode算法题-Add Binary(Java实现)

    这是悦乐书的第157次更新,第159篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第16题(顺位题号是67).给定两个二进制字符串,返回它们的总和(也是二进制字符串).输 ...

  3. LeetCode算法题-Balanced Binary Tree(Java实现)

    这是悦乐书的第167次更新,第169篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第26题(顺位题号是110).给定二叉树,判断它是否是高度平衡的.对于此问题,高度平衡二 ...

  4. LeetCode算法题-Rotated Digits(Java实现)

    这是悦乐书的第316次更新,第337篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第185题(顺位题号是788).如果一个数字经过180度旋转后,变成了一个与原数字不同的 ...

  5. LeetCode算法题-Image Smoother(Java实现)

    这是悦乐书的第282次更新,第299篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第150题(顺位题号是661).给定表示图像灰度的2D整数矩阵M,您需要设计一个平滑器以 ...

  6. LeetCode算法题-Non-decreasing Array(Java实现)

    这是悦乐书的第283次更新,第300篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第151题(顺位题号是665).给定一个包含n个整数的数组,您的任务是通过修改最多1个元 ...

  7. LeetCode算法题-Distribute Candies(Java实现)

    这是悦乐书的第266次更新,第279篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第133题(顺位题号是575).给定具有偶数长度的整数数组,其中该数组中的不同数字表示不 ...

  8. LeetCode算法题-Detect Capital(Java实现)

    这是悦乐书的第251次更新,第264篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第118题(顺位题号是520).给定一个单词,你需要判断其中大写字母的使用是否正确.当下 ...

  9. LeetCode算法题-Hamming Distance(Java实现)

    这是悦乐书的第237次更新,第250篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第104题(顺位题号是461).两个整数之间的汉明距离是相应位不同的位置数.给定两个整数 ...

随机推荐

  1. C#使用Windows Service

    前言:Microsoft Windows 服务(即,以前的 NT 服务)使您能够创建在它们自己的 Windows 会话中可长时间运行的可执行应用程序.这些服务可以在计算机启动时自动启动,可以暂停和重新 ...

  2. asp.net core系列 39 Web 应用Razor 介绍与详细示例

    一. Razor介绍 在使用ASP.NET Core Web开发时, ASP.NET Core MVC 提供了一个新特性Razor. 这样开发Web包括了MVC框架和Razor框架.对于Razor来说 ...

  3. Python爬虫入门教程 32-100 B站博人传评论数据抓取 scrapy

    1. B站博人传评论数据爬取简介 今天想了半天不知道抓啥,去B站看跳舞的小姐姐,忽然看到了评论,那就抓取一下B站的评论数据,视频动画那么多,也不知道抓取哪个,选了一个博人传跟火影相关的,抓取看看.网址 ...

  4. SmartSql = Dapper + MyBatis + Cache(Memory | Redis) + ZooKeeper + R/W Splitting + ......

    SmartSql Why 拥抱 跨平台 DotNet Core,是时候了. 高性能.高生产力,超轻量级的ORM.156kb (Dapper:168kb) So SmartSql TargetFrame ...

  5. Azkaban学习之路 (三)Azkaban的使用

    界面介绍 首页有四个菜单 projects:最重要的部分,创建一个工程,所有flows将在工程中运行. scheduling:显示定时任务 executing:显示当前运行的任务 history:显示 ...

  6. Linux常用监控命令简介 - top

    top -hv | -bcisS -d delay -n iterations -p pid [, pid ...] 指令介绍-b : 批次模式运行.-c : 显示执行任务的命令行.-d : 设定延迟 ...

  7. 根据数值获得概率密度pdf和累积密度分布cdf(MATLAB语言)

    y=randn(1,3000); % 生成1-by-3000的标准正态分布随机数 ymin=min(y); ymax=max(y); x=linspace(ymin,ymax,20); %将最大最小区 ...

  8. SSH隧道:端口转发功能详解

    SSH系列文章: SSH基础:SSH和SSH服务 SSH转发代理:ssh-agent用法详解 SSH隧道:端口转发功能详解 1.1 ssh安全隧道(一):本地端口转发 如下图,假如host3和host ...

  9. 使用LR编写HTTP协议Json报文格式接口脚本实战

    最近在做HTTP协议接口压测时,遇到一些编写脚本方面的问题,在这里总结记录下,以便以后温习,也希望能帮助到和我有同样困惑的朋友吧. //实战代码如下所示:Action() { lr_start_tra ...

  10. 【.NET Core项目实战-统一认证平台】第十三章 授权篇-如何强制有效令牌过期

    [.NET Core项目实战-统一认证平台]开篇及目录索引 上一篇我介绍了JWT的生成验证及流程内容,相信大家也对JWT非常熟悉了,今天将从一个小众的需求出发,介绍如何强制令牌过期的思路和实现过程. ...