【LeetCode】第696题——计数二进制子串(难度:简单)

【LeetCode】第696题——计数二进制子串(难度:简单)

题目描述

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

  1. 示例 1 :
    输入: “00110011”
    输出: 6
    解释: 有6个子串具有相同数量的连续1和0:“0011”,“01”,“1100”,“10”,“0011” 和 “01”。
    请注意,一些重复出现的子串要计算它们出现的次数。
    另外,“00110011”不是有效的子串,因为所有的0(和1)没有组合在一起。

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

提示:
s.length 在1到50,000之间。
s 只包含“0”或“1”字符。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/count-binary-substrings
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路

首先我自己定义一个概念“字段”

若一段字符子串均由一种字符组成,则称它为“字段”。如“001100”有“00”、“11”、“00”三个字段;如“010”有“0”、“1”、“0”三个字段。

用ans变量记录结果,则答案就是ans不断累加相邻字段长度的最小值即可。

例子:“00110”,字段有“00”、“11”、“0”,相邻字段长度的最小值分别为2和1,因此返回2+1=3。

代码详解

class Solution {
    public int countBinarySubstrings(String s) {
        int ans = 0;	// 结果
        int countp = 1;	// countp和countq是记录相邻字段长度的变量
        int countq = 0;	// 为什么countp的初始值为1?就是提前把s中下标为0的字符提前算上了,遍历从下标为1的字符开始
        char c = s.charAt(0);	// 用变量c来划分我自己定义的“字段”
        for(int i = 1; i < s.length(); ++i) {	// 从下标为1的字符开始遍历
           if(s.charAt(i) == c) {
               ++countp;	// s.charAt(i)算入当前字段
           } else {
               // s.charAt(i)算入下一字段
               ans += Math.min(countp, countq);	// 相邻字段长度的最小值 不断累加
               countq = countp;	// 保留当前字段长度
               countp = 1;  	// 重新计数下一字段长度
               c = s.charAt(i);
           }
        }
        ans += Math.min(countp, countq);	// 最后还要额外加一遍
        // 因为循环中只是加“当前字段的长度”,“下一字段的长度”是在下一个循环加入的
        return ans;
    }
}

注意点

  • 注意最后还要额外累加一遍。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值