这是悦乐书的第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. 软件性能测试技术树(三)----数据库(MySQL)性能

    全图: MySQL重点监控指标: MySQL主流分支: 数据库架构设计: MySQL慢查询: SQL语句分析与调优: MySQL索引: MySQL存储引擎: MySQL实时监控: MySQL集群监控工 ...

  2. synchronized底层实现学习

    上文我们总结了 synchronized 关键字的基本用法以及作用,并未涉及 synchronized 底层是如何实现的,所谓刨根问底,本文我们就开始 synchronized 原理的探索之旅吧(*& ...

  3. SpringCloud Config客户端

     SpringCloud Config服务端 1.导入依赖 <dependency> <groupId>org.springframework.cloud</groupI ...

  4. ansible学习系列1-ansible简介

    1.ansible简介 官方说明:Ansible is an IT automation tool. It can configure systems, deploy software, and or ...

  5. PE知识复习之PE的RVA与FOA的转换

    PE知识复习之PE的RVA与FOA的转换 一丶简介PE的两种状态 首先我们知道PE有两种状态.一种是内存展开.一种是在文件中的状态.那么此时我们有一个需求. 我们想改变一个全局变量的初始值.此时应该怎 ...

  6. Perl List::Util模块用法详解

    本文介绍Perl标准库List::Utils中的列表工具,有时候它们非常好用.比如Perl中测试列表中是否包含某个元素(某个元素是否存在于列表中)没有比较直接比较方便的功能,但使用List::Util ...

  7. [Go] 使用go语言解决现代编程难题

    1.计算机一直在演化,64核,128核等等,但是我们依旧在使用为单核设计的技术编程2.Go语言让分享自己的代码包更容易3.Go语言重新思考传统的面向对象,提供了更高效的复用代码手段4.Go不仅提供高性 ...

  8. js数组方法大全

    JavaScript中创建数组有两种方式 (一)使用 Array 构造函数: var arr1 = new Array(); //创建一个空数组var arr2 = new Array(20); // ...

  9. es6 常用方法

    来自 https://www.cnblogs.com/lhl66/p/9555903.html 侵删 来自 https://www.cnblogs.com/lhl66/p/8862106.html 侵 ...

  10. maven 聚合

    聚合很简单, 在父 pom 中写出子 pom 文件的路径即可 <name>parent Maven Webapp</name> <!-- FIXME change it ...