1. 具体题目

给定一个字符串 s,计算具有相同数量0和1的非空(连续)子字符串的数量,并且这些子字符串中的所有0和所有1都是组合在一起的。重复出现的子串要计算它们出现的次数。

示例 1 :  输入: "00110011"  输出: 6  解释: 有6个子串具有相同数量的连续1和0:“0011”,“01”,“1100”,“10”,“0011” 和 “01”。

请注意,一些重复出现的子串要计算它们出现的次数。另外,“00110011”不是有效的子串,因为所有的0(和1)没有组合在一起。

示例 2 :  输入: "10101"  输出: 4  解释: 有4个子串:“10”,“01”,“10”,“01”,它们具有相同数量的连续1和0。

2. 思路分析

看到题目,首先想到了leetcode20.有效的括号,将 '0' 和 1' 等效于括号,设置一个计数器。但是要遍历字符串2次,第一次遇到 '0' 计数器 + 1,遇到 '1' 计数器 - 1;第二次遇到 '1' 计数器 + 1,遇到 '0' 计数器 - 1。

3. 代码

 public int countBinarySubstrings(String s) {
int count = 0;
int res = 0;
for(int i = 0; i < s.length(); i++){
if(s.charAt(i) == '0') count++;
if(s.charAt(i) == '1'){  
if(count > 0){  //若有可配对的"0",结果 + 1
res++;
count--;
}
if(i + 1 < s.length() && s.charAt(i + 1) == '0'){  //若无可配对的"1",计数器置0
count = 0;
}
}
}
count = 0;
for(int i = 0; i < s.length(); i++){
if(s.charAt(i) == '1') count++;
if(s.charAt(i) == '0'){
if(count > 0){
res++;
count--;
}
if(i + 1 < s.length() && s.charAt(i + 1) == '1'){
count = 0;
}
}
}
return res;
}

4. 思路优化

实际上,字符串中若有 n 个 "0" 和 (n + m) 个 "1" 相邻,则说明可以产生 n 个重复字符串,所以只要统计数组中各连续子串中元素的数量即可,比如s=“11000111000000”,则可以得到一个统计数组groups = [2,3,4,6],对该数组做遍历,每次得到 min(groups[i], groups[i+1])的值,将其全部相加可得最后结果。

5. 代码优化

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

leetcode.字符串.696计数二进制子串-java的更多相关文章

  1. Java实现 LeetCode 696 计数二进制子串(暴力)

    696. 计数二进制子串 给定一个字符串 s,计算具有相同数量0和1的非空(连续)子字符串的数量,并且这些子字符串中的所有0和所有1都是组合在一起的. 重复出现的子串要计算它们出现的次数. 示例 1 ...

  2. leetcode(js)算法之696计数二进制串

    给定一个字符串 s,计算具有相同数量0和1的非空(连续)子字符串的数量,并且这些子字符串中的所有0和所有1都是组合在一起的. 重复出现的子串要计算它们出现的次数. 示例: 输入: "0011 ...

  3. [Swift]LeetCode696. 计数二进制子串 | Count Binary Substrings

    Give a string s, count the number of non-empty (contiguous) substrings that have the same number of ...

  4. [LeetCode]最长回文子串 java

    题目: 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为1000. 示例 1: 输入: "babad" 输出: "bab" 注意: ...

  5. leetcode.字符串.12整数转罗马数字-Java

    1. 具体题目 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. I 1V   5X 10L     50C    100D    500M   1000例如, 罗马数字 2 写做  ...

  6. 【LeetCode】1461. 检查一个字符串是否包含所有长度为 K 的二进制子串 Check If a String Contains All Binary Codes of Size K

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 统计长度为 K 的子串个数 日期 题目地址:https ...

  7. java实现字符串匹配问题之求两个字符串的最大公共子串

    转载请注明出处:http://blog.csdn.net/xiaojimanman/article/details/38924981 近期在项目工作中有一个关于文本对照的需求,经过这段时间的学习,总结 ...

  8. 【Java】获取两个字符串中最大相同子串

    题目 获取两个字符串中最大相同子串 前提 两个字符串中只有一个最大相同子串 解决方案 public class StringDemo { public static void main(String[ ...

  9. LeetCode 字符串专题(一)

    目录 LeetCode 字符串专题 <c++> \([5]\) Longest Palindromic Substring \([28]\) Implement strStr() [\(4 ...

随机推荐

  1. Cococs2d-x学习路线

    |   版权声明:本文为博主原创文章,未经博主允许不得转载. Cocos2D-X推荐书: Cocos2d-x权威指南

  2. Spingboot整合Redis,用注解(@Cacheable、@CacheEvict、@CachePut、@Caching)管理缓存

    背景:项目从头开始,需结合Springboot和Redis 需求:用注解管理缓存 方法:     一.用Redis取代Springboot原有缓存 1.pom引入依赖     2.applicatio ...

  3. 使用font-size:0px 来制作跨浏览器的inline-block css属性

    如果排列的元素是等高的话,相信很多人都会使用浮动来布局,不过如果元素不等高的话,不添加多余的标签,浮动布局是很难实现下图中的效果.如果遇到这种情况,可以使用inline-block来布局. 现代浏览器 ...

  4. 24-python基础-python3-浅拷贝与深拷贝(2)

    4.copy 模块的 copy()和 deepcopy()函数   在处理列表和字典时,尽管传递引用常常是最方便的方法,但如果函数修改了传入的列表或字典,可能不希望这些变动影响原来的列表或字典.要做到 ...

  5. tooltip(提示框)组件

    一.class加载方式 <span id="pos" class="easyui-tooltip" title="这是提示内容"> ...

  6. 解决vue项目打包之后出现源代码的问题

    config/index.js 页面找到productionSourceMap:ture 改为 productionSourceMap:false

  7. 最详细的 Android Toolbar 开发实践总结(转)

    转自:http://www.codeceo.com/article/android-toolbar-develop.html 过年前发了一篇介绍 Translucent System Bar 特性的文 ...

  8. PHP构建一句话木马

    构建一句话木马,密码为simple: url/search.php?searchtype=5&tid=&area=eval($_POST[simple]) 之后使用菜刀进行链接,密码为 ...

  9. k8s集群搭建之一:基础环境

    一按照kubernetes对软件和硬件的要求: 二准备的主机系统以及ip配置 角色 系统 IP k8s-master centos7.4 192.168.137.66 k8s-node1 centos ...

  10. Android Studio奇淫巧技

    目录 3.1 Android Studio使用初探 Project面板 Stucture面板 Android Monitor Keymap Tip of the Day 快速查找 Search Act ...