leetcode.字符串.696计数二进制子串-java
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的更多相关文章
- Java实现 LeetCode 696 计数二进制子串(暴力)
		696. 计数二进制子串 给定一个字符串 s,计算具有相同数量0和1的非空(连续)子字符串的数量,并且这些子字符串中的所有0和所有1都是组合在一起的. 重复出现的子串要计算它们出现的次数. 示例 1 ... 
- leetcode(js)算法之696计数二进制串
		给定一个字符串 s,计算具有相同数量0和1的非空(连续)子字符串的数量,并且这些子字符串中的所有0和所有1都是组合在一起的. 重复出现的子串要计算它们出现的次数. 示例: 输入: "0011 ... 
- [Swift]LeetCode696. 计数二进制子串 | Count Binary Substrings
		Give a string s, count the number of non-empty (contiguous) substrings that have the same number of ... 
- [LeetCode]最长回文子串 java
		题目: 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为1000. 示例 1: 输入: "babad" 输出: "bab" 注意: ... 
- leetcode.字符串.12整数转罗马数字-Java
		1. 具体题目 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. I 1V 5X 10L 50C 100D 500M 1000例如, 罗马数字 2 写做 ... 
- 【LeetCode】1461. 检查一个字符串是否包含所有长度为 K 的二进制子串 Check If a String Contains All Binary Codes of Size K
		作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 统计长度为 K 的子串个数 日期 题目地址:https ... 
- java实现字符串匹配问题之求两个字符串的最大公共子串
		转载请注明出处:http://blog.csdn.net/xiaojimanman/article/details/38924981 近期在项目工作中有一个关于文本对照的需求,经过这段时间的学习,总结 ... 
- 【Java】获取两个字符串中最大相同子串
		题目 获取两个字符串中最大相同子串 前提 两个字符串中只有一个最大相同子串 解决方案 public class StringDemo { public static void main(String[ ... 
- LeetCode 字符串专题(一)
		目录 LeetCode 字符串专题 <c++> \([5]\) Longest Palindromic Substring \([28]\) Implement strStr() [\(4 ... 
随机推荐
- Python判断一个字符串中是否存在多个子串中的一个
			在使用python的开发过程中,常常需要判断,字符串中是否存在子串的问题, 但判断一个字符串中是否存在多个字串中的一个时,如if (a or b) in c或者if x contains a|b|c| ... 
- Oracle多种表连接方式
			1. 内连接(自然连接) 2. 外连接 (1)左外连接 (左边的表不加限制) (2)右外连接(右边的表不加限制) (3)全外连接(左右两表都不加限制) 3. 自连接(同一张表内的连接) SQL的标准语 ... 
- jq 将translate的旋转角度转为数值
			// 将translate内的角度转为数值 function getmatrix(nowDeg){ var values = nowDeg.split('(')[1].split(')')[0].sp ... 
- 2019-5-21-win10-uwp-url-encode
			title author date CreateTime categories win10 uwp url encode lindexi 2019-5-21 9:54:7 +0800 2018-2-1 ... 
- strcoll - 用当前的区域选项来比较两个字符串
			总览 (SYNOPSIS) #include <string.h> int strcoll(const char *s1, const char *s2); 描述 (DESCRIPTION ... 
- RK3288编译 Android 5.1 固件
			1 准备工作 编译 Android 对机器的配置要求较高: 64 位 CPU 16GB 物理内存+交换内存 30GB 空闲的磁盘空间用于构建,源码树另外占用大约 25GB Ubuntu 14.04 操 ... 
- word2vec 原理浅析 及高效训练方法
			1. https://www.cnblogs.com/cymx66688/p/11185824.html (word2vec中的CBOW 和skip-gram 模型 浅析) 2. https://ww ... 
- ubuntu批量转换所有子文件夹下图片文件格式
			第一步按照 sudo apt-get install imagemagick 对于一个文件,可以: convert ubuntuhandbook.png ubuntuhandbook.jpg 对于多个 ... 
- No symbol table is loaded.  Use the "file" command.
			No symbol table is loaded. Use the "file" command. gdb 1. 首先使用gcc -g .c文件 -o 可执行文 ... 
- 【css对齐】块内或者行内图片与文字居中对齐最靠谱的方式!
			块内或者行内图片与文字居中对齐最靠谱的方式! 做图片与文字在一行的按钮时候最常用到,总结了一个靠谱的方法,终于可以完美的对齐下面给个代码 首先是html: <p class="btnU ... 
