1. 问题背景与定义
平衡子串是字符串处理中一个经典问题变种,题目要求我们在一串由'0'和'1'组成的二进制字符串中,找出最长的平衡子串。这里的平衡子串定义为:子串中'0'和'1'的数量相等,且所有'0'都出现在所有'1'之前。
举个实际例子,在字符串"001011"中:
- "0011"是平衡子串(长度为4)
- "0101"不是平衡子串(虽然0和1数量相等,但0和1交替出现)
- "01"是平衡子串(长度为2)
这个问题看似简单,但考察了多个编程基础能力:
- 字符串遍历与子串提取
- 字符计数与状态记录
- 边界条件处理
- 算法效率优化
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 暴力解法与优化思路
2.1 基础暴力解法
最直观的解法是检查所有可能的子串,判断其是否满足平衡条件。具体步骤:
- 双重循环枚举所有子串(i从0到n-1,j从i到n-1)
- 对每个子串统计0和1的数量
- 检查是否满足:0的数量=1的数量,且最后一个0的位置<第一个1的位置
- 记录满足条件的最大长度
python复制def findTheLongestBalancedSubstring(s):
max_len = 0
n = len(s)
for i in range(n):
for j in range(i+1, n):
substr = s[i:j+1]
cnt0 = substr.count('0')
cnt1 = substr.count('1')
if cnt0 == cnt1:
last0 = substr.rfind('0')
first1 = substr.find('1')
if last0 < first1:
max_len = max(max_len, j-i+1)
return max_len
时间复杂度:O(n³)(双重循环+子串操作)
空间复杂度:O(1)
提示:在LeetCode等编程竞赛中,n的规模通常在10^5级别,这种解法会超时。
