1. 题目解析与问题定义
今天在LeetCode第471场周赛中遇到了第二题"3713. 最长的平衡子串 I",这是一道典型的字符串处理问题。题目要求我们找出给定二进制字符串中最长的平衡子串,其中平衡子串定义为包含相同数量的0和1,并且所有0都在1之前的子串。
举个例子,对于字符串"001011",最长的平衡子串是"0011",长度为4。而"0101"虽然0和1数量相同,但不满足0都在1之前的条件,所以不是平衡子串。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 解题思路分析
2.1 暴力解法可行性评估
最直观的想法是暴力枚举所有可能的子串,然后检查每个子串是否满足平衡条件。对于一个长度为n的字符串,子串数量是O(n²)级别,检查每个子串需要O(n)时间,总时间复杂度为O(n³)。这在n≤50的数据范围内是可行的,因为50³=125,000次操作在现代计算机上可以瞬间完成。
2.2 优化思路探索
虽然暴力解法可行,但我们可以思考更高效的解法。观察到平衡子串必须满足:
- 0和1的数量相等
- 所有0都出现在所有1之前
这意味着我们可以寻找这样的区间:在这个区间内,前半部分全是0,后半部分全是1,且0和1的数量相同。这提示我们可以通过统计0和1的累积数量来优化计算。
3. 最优解法实现
3.1 滑动窗口法
我们可以使用滑动窗口技术来优化解法。具体步骤如下:
- 初始化两个指针left和right,表示窗口的左右边界
- 移动right指针扩展窗口
- 当窗口内0的数量等于1的数量时,检查是否所有0都在1之前
- 如果是,则更新最大长度
- 移动left指针收缩窗口
这种方法可以将时间复杂度优化到O(n²),因为每个子串的检查可以在O(1)时间内完成(通过预处理前缀和)。
3.2 代码实现
python复制def findTheLongestBalancedSubstring(s: str) -> int:
max_len = 0
n = len(s)
for i in range(n):
zeros = 0
ones = 0
for j in range(i, n):
if s[j] == '0':
