1 条题解
-
0
题目分析
我们需要在字符串中找到最长的连续子串,使得其中字母
J、O、I的出现次数完全相同。关键思路
-
问题转化
- 设子串从位置
l到r,长度为r-l+1 - 要求:
cnt_J = cnt_O = cnt_I = k - 这意味着子串长度必须是
3k
- 设子串从位置
-
前缀和表示
- 定义三个前缀和数组:
preJ[i]:前 i 个字符中J的个数preO[i]:前 i 个字符中O的个数preI[i]:前 i 个字符中I的个数
- 对于子串
[l, r],各字母出现次数为:J_count = preJ[r] - preJ[l-1]O_count = preO[r] - preO[l-1]I_count = preI[r] - preI[l-1]
- 定义三个前缀和数组:
-
等量关系转化
- 要求
J_count = O_count = I_count - 这等价于:
preJ[r] - preJ[l-1] = preO[r] - preO[l-1]preJ[r] - preJ[l-1] = preI[r] - preI[l-1]
- 整理得:
preJ[r] - preO[r] = preJ[l-1] - preO[l-1]preJ[r] - preI[r] = preJ[l-1] - preI[l-1]
- 要求
-
核心观察
- 定义差值状态:
(preJ[i] - preO[i], preJ[i] - preI[i]) - 如果两个位置
l-1和r的差值状态相同,那么子串[l, r]就是满足条件的 - 我们只需要找到相同差值状态出现的最远距离
- 定义差值状态:
-
算法步骤
- 初始化哈希表,记录每个差值状态第一次出现的位置
- 遍历字符串,计算当前的前缀和和差值状态
- 如果当前差值状态之前出现过,计算距离并更新答案
- 如果当前差值状态是新的,记录其第一次出现的位置
- 特别处理初始状态
(0, 0),对应空前缀
-
复杂度分析
- 时间复杂度:O(N),只需一次遍历
- 空间复杂度:O(N),用于存储哈希表
这种方法巧妙地利用了前缀和的差分性质,将原本需要 O(N²) 的暴力枚举优化到了线性时间复杂度。
-
- 1
信息
- ID
- 4443
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者