【LeetCode: 696. 计数二进制子串 + 思维】-LMLPHP

【LeetCode: 696. 计数二进制子串 + 思维】-LMLPHP

【LeetCode: 696. 计数二进制子串 + 思维】-LMLPHP

🚩 题目链接

⛲ 题目描述

给定一个字符串 s,统计并返回具有相同数量 0 和 1 的非空(连续)子字符串的数量,并且这些子字符串中的所有 0 和所有 1 都是成组连续的。

重复出现(不同位置)的子串也要统计它们出现的次数。

示例 1:

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

输入:s = “10101”
输出:4
解释:有 4 个子串:“10”、“01”、“10”、“01” ,具有相同数量的连续 1 和 0 。

提示:

1 <= s.length <= 105
s[i] 为 ‘0’ 或 ‘1’

🌟 求解思路&实现代码&运行结果


⚡ 思维

🥦 求解思路
  1. 我们直接统计字符串中每一段连续字符的次数,并记录到集合中,然后按顺序遍历集合,俩个一组取最小的数,作为当前可以组成具有相同数量 0 和 1 的非空(连续)子字符串的数量。
  2. 有了基本的思路,接下来我们就来通过代码来实现一下。
🥦 实现代码
class Solution {
    public int countBinarySubstrings(String s) {
        int n = s.length();
        int index = 0;
        ArrayList<Integer> list = new ArrayList<>();
        while (index < n) {
            char target = s.charAt(index);
            int j = index;
            while (j < n && s.charAt(j) == target) {
                j++;
            }
            list.add(j - index);
            index = j;
        }
        int cnt = 0;
        for (int i = 1; i < list.size(); i++) {
            cnt += Math.min(list.get(i), list.get(i - 1));
        }
        return cnt;
    }
}
🥦 运行结果

【LeetCode: 696. 计数二进制子串 + 思维】-LMLPHP


💬 共勉

【LeetCode: 696. 计数二进制子串 + 思维】-LMLPHP

【LeetCode: 696. 计数二进制子串 + 思维】-LMLPHP

04-20 12:28