1. 问题背景与定义
平衡子串是字符串处理中一个有趣的概念。在本题中,平衡子串被定义为:子串中所有出现的字母,其出现次数完全相同。例如:
- "aabb"是平衡的(a和b各出现2次)
- "abcabc"是平衡的(a、b、c各出现2次)
- "leetcode"不是平衡的(e出现3次,其他字母出现次数不等)
这个问题来自LeetCode第471场周赛的第二题,属于字符串处理类的中等难度题目。理解这类问题对培养扎实的算法思维很有帮助,特别是在处理子串、统计频率等场景。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 暴力解法思路解析
2.1 基础思路
暴力枚举是最直观的解法,虽然时间复杂度较高,但对于理解问题本质很有帮助。其核心思路是:
- 检查所有可能的子串
- 对每个子串统计字母频率
- 验证是否满足平衡条件
- 记录满足条件的最大长度
2.2 具体实现步骤
2.2.1 边界处理
首先处理空字符串的特殊情况:
java复制if(n==0) return 0;
这是必要的防御性编程,避免后续操作出现异常。
2.2.2 初始化设置
设置初始最大长度maxlen为1,因为单个字符本身就是平衡的:
java复制int maxlen=1;
2.2.3 双重循环枚举
外层循环确定子串起始位置i,内层循环确定结束位置j:
java复制for(int i=0;i<n;i++){
int[] nums=new int[26];
for(int j=i;j<n;j++){
// 统计和处理逻辑
}
}
这里使用固定大小的26位数组nums来统计字母频率,利用ASCII码特性('a'-'a'=0,'b'-'a'=1等)实现高效映射。
2.2.4 频率统计与验证
对每个子串:
- 更新当前字符计数
- 收集所有出现过的字母的计数
- 检查这些计数是否全部相同
java复制int x=s.charAt(j)-'a';
nums[x]++;
List<Integer> counts=new ArrayList<>();
for(int k=0;k<26;k++){
if(nums[k]>0) counts.add(nums[k]);
}
bo
