2609. 最长平衡子字符串

2609. 最长平衡子字符串
难度: 简单
来源: 每日一题 2023.11.08

给你一个仅由 01 组成的二进制字符串 s

如果子字符串中 所有的 0 都在 1 之前 且其中 0 的数量等于 1 的数量,则认为 s 的这个子字符串是平衡子字符串。请注意,空子字符串也视作平衡子字符串。

返回 s 中最长的平衡子字符串长度。

子字符串是字符串中的一个连续字符序列。

示例 1:

输入:s = "01000111"
输出:6
解释:最长的平衡子字符串是 "000111" ,长度为 6 。

示例 2:

输入:s = "00111"
输出:4
解释:最长的平衡子字符串是 "0011" ,长度为  4 。

示例 3:

输入:s = "111"
输出:0
解释:除了空子字符串之外不存在其他平衡子字符串,所以答案为 0 。

提示:

  • 1 <= s.length <= 50
  • '0' <= s[i] <= '1'
Java 复制代码
class Solution {
    public int findTheLongestBalancedSubstring(String s) {

    }
}
分析与题解

  • 计数模拟法

    这个题其实我们只需要知道, 什么时候启动下一个子串什么时候比较最终结果就好.

    为了满足题意, 停止条件只会有一个, 那就是前面有 n 个 1 , 当前位置数字是 0, 就要停止了, 这时候判断子串的长度. 输出到最终结果中, 同时这时候也是新一轮的开始.

    由于前面的 10 的个数不一样, 例如一个这样的数字 001110, 在最后一个 0 满足了条件停止了, 所以, 我们得到了 00111 那么平衡子字符串应该是 0011, 这时候我们只需要取前面子串的 01 数量较少的个数乘以2就是平衡子字符串的长度.

    接下来, 我们看一下解题过程. 首页我们定义两个常量 zeroone 用来存储子串的 01 的数量情况.

    Java 复制代码
    int zero = 0, one = 0;

    然后, 我们进行遍历, 先判断当前是 0 的情况, 当 one > 0 也就是前面子串有 1 就进入停止逻辑. 停止逻辑中除了要输出maxLength, 还要清空 zeroone, 来为下一次子串判断做准备.

    Java 复制代码
    if (s.charAt(i) == '0') {
        if (one != 0) {
            // 有1 停止了
            // 找两者中较小的值, 然后乘以2与最终结果做比较
            int minCount = Math.min(zero, one);
            maxLength = Math.max(maxLength, minCount * 2);
            // 清空数据
            zero = 0;
            one = 0;
            // 再进行下一轮
        }
        zero++;
    } 

    对于 当前下标对应数字是 1 的情况, 我们只需要判断前面有 0, 我们就对 one 进行 +1 操作.

    Java 复制代码
    if (zero > 0) {
        one++;
    }

    当然了, 在遍历完成之后, 最后一个子串肯定没法在循环中判断, 我们直接在外部再进行一次判断即可.

    Java 复制代码
    // 遍历完成,判断最后的一组数据情况
    if (zero > 0 && one > 0) {
        int minCount = Math.min(zero, one);
        maxLength = Math.max(maxLength, minCount * 2);
    }

    那么接下来, 我们就看一下整体的题解过程.

    Java 复制代码
    class Solution {
        public int findTheLongestBalancedSubstring(String s) {
            int zero = 0, one = 0;
            int maxLength = 0;
            for(int i = 0; i < s.length(); i++) {
                if (s.charAt(i) == '0') {
                    if (one != 0) {
                        // 有1 停止了
                        // 找两者中较小的值, 然后乘以2与最终结果做比较
                        int minCount = Math.min(zero, one);
                        maxLength = Math.max(maxLength, minCount * 2);
                        // 清空数据
                        zero = 0;
                        one = 0;
                        // 再进行下一轮
                    }
                    zero++;
                } else {
                    if (zero > 0) {
                        one++;
                    }
                }
            }
            // 遍历完成,判断最后的一组数据情况
            if (zero > 0 && one > 0) {
                int minCount = Math.min(zero, one);
                maxLength = Math.max(maxLength, minCount * 2);
            }
            return maxLength;
        }
    }

    复杂度分析:

    • 时间复杂度: O(n), 与字符串数组长度相关的时间复杂度.
    • 空间复杂度: O(1), 常量基本的时间复杂度.

    结果如下所示.

相关推荐
风影小子6 分钟前
注册登录学生管理系统小项目
算法
黑龙江亿林等保9 分钟前
深入探索哈尔滨二级等保下的负载均衡SLB及其核心算法
运维·算法·负载均衡
起名字真南11 分钟前
【OJ题解】C++实现字符串大数相乘:无BigInteger库的字符串乘积解决方案
开发语言·c++·leetcode
lucy1530275107911 分钟前
【青牛科技】GC5931:工业风扇驱动芯片的卓越替代者
人工智能·科技·单片机·嵌入式硬件·算法·机器学习
杜杜的man27 分钟前
【go从零单排】迭代器(Iterators)
开发语言·算法·golang
小沈熬夜秃头中୧⍤⃝44 分钟前
【贪心算法】No.1---贪心算法(1)
算法·贪心算法
木向1 小时前
leetcode92:反转链表||
数据结构·c++·算法·leetcode·链表
阿阿越1 小时前
算法每日练 -- 双指针篇(持续更新中)
数据结构·c++·算法
skaiuijing2 小时前
Sparrow系列拓展篇:对调度层进行抽象并引入IPC机制信号量
c语言·算法·操作系统·调度算法·操作系统内核
Star Patrick2 小时前
算法训练(leetcode)二刷第十九天 | *39. 组合总和、*40. 组合总和 II、*131. 分割回文串
python·算法·leetcode