zoukankan      html  css  js  c++  java
  • 【LeetCode】696. 计数二进制子串

    题目链接

    计数二进制子串

    题目描述

    给定一个字符串 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。
    
    注意:
    s.length 在1到50,000之间。
    s 只包含“0”或“1”字符。
    

    解题思路

    我们可以将字符串 s 按照 0 和 1的连续段分组,存在counts 数组中,例如 s = 00111011可以得到这样的counts 数组:{counts} = {2, 3, 1, 2};counts数组中的两个相邻的数一定代表着两种不同的数据,经过观法可以发现,两种不同数据组成的满足条件的子串数目=min(a,b);

    例如00111,counts = {2,3},能组成的满足条件的子串数目=min(2,3) = 2,经过验证确实为2

    AC代码

    解法一:

    两次遍历,空间复杂度时间复杂度都为O(n)

    class Solution {
        public int countBinarySubstrings(String s) {
            ArrayList<Integer> ls = new ArrayList<Integer>();
            int num = 1;
            for(int i = 1; i < s.length(); i++){
                if(s.charAt(i) == s.charAt(i-1)) num++;
                else{
                    ls.add(num);
                    num = 1;
                }
            }
            ls.add(num);
            int ans = 0;
            for(int i = 1; i < ls.size(); i++){
                ans += Math.min(ls.get(i),ls.get(i-1));
            }
            return ans;
        }
    }
    

    解法二:

    解法二是对解法一的优化,理解了解法一,解法二就非常容易理解了,

    一次遍历,空间复杂度O(1)时间复杂度O(n)

    class Solution {
        public int countBinarySubstrings(String s) {
            int num = 1;
            int anoth = 0;
            int ans = 0;
            for(int i = 1; i < s.length(); i++){
                if(s.charAt(i) == s.charAt(i-1)){
                    num++;
                }else{
                    ans += Math.min(num,anoth);
                    anoth = num;
                    num = 1;
                }
            }
            ans += Math.min(num,anoth);
            return ans;
    
        }
    }
    
  • 相关阅读:
    JavaScript的DOM操作(节点操作)
    php算法
    php常用函数
    去掉表单中的回车、换行、空格
    linux(centos)搭建SVN服务器
    同一台机子上用多个git 账号
    房屋交易合同
    简单的css 菜单
    Spring Collections XML 配置
    不同java 版本的新功能
  • 原文地址:https://www.cnblogs.com/XDU-Lakers/p/13471973.html
Copyright © 2011-2022 走看看