问题描述
给定一个只包含字符A、S、D、F的字符串,且字符串长度总是4的倍数。任务是通过尽可能少的替换,使得A、S、D、F这四个字符在字符串中出现的频次相等。求出实现这一条件的最小子串长度。
解题思路
-
目标频次计算:
- 由于字符串长度总是4的倍数,目标频次可以通过将字符串长度除以4得到。
- 例如,字符串长度为16,则目标频次为4。
-
统计当前频次:
- 使用一个数组
freq来统计每个字符A、S、D、F的当前频次。 - 遍历字符串,将每个字符的频次累加到
freq数组中。
- 使用一个数组
-
计算差值:
- 使用一个数组
diff来存储每个字符当前频次与目标频次的差值。 - 如果某个字符的当前频次小于目标频次,则差值为0(因为不需要增加该字符的频次)。
- 使用一个数组
-
滑动窗口技术:
- 使用两个指针
left和right来表示窗口的左右边界。 - 扩展窗口:将
right指针向右移动,并更新窗口内字符的频次。 - 检查窗口是否满足条件:如果窗口内的字符频次满足差值要求,则记录当前窗口长度,并尝试缩小窗口。
- 缩小窗口:将
left指针向右移动,并更新窗口内字符的频次。
- 使用两个指针
-
返回结果:
- 最终返回满足条件的最小窗口长度。
关键点总结
- 目标频次计算:通过字符串长度除以4得到目标频次。
- 频次统计与差值计算:使用数组统计当前频次,并计算每个字符的差值。
- 滑动窗口技术:通过扩展和缩小窗口来找到满足条件的最小子串。
- 边界条件处理:如果所有字符的频次已经相等,直接返回0。
-
复杂度分析
时间复杂度
-
初始频次统计:
- 遍历整个字符串一次,统计每个字符的频次。时间复杂度为
O(n),其中n是字符串的长度。
- 遍历整个字符串一次,统计每个字符的频次。时间复杂度为
-
差值计算:
- 遍历频次数组一次,计算每个字符的差值。时间复杂度为
O(1),因为频次数组的长度固定为4。
- 遍历频次数组一次,计算每个字符的差值。时间复杂度为
-
滑动窗口:
- 使用滑动窗口技术来找到满足条件的最小子串。在最坏情况下,
right指针会遍历整个字符串一次,left指针也会遍历整个字符串一次。因此,滑动窗口的时间复杂度为O(n)。
- 使用滑动窗口技术来找到满足条件的最小子串。在最坏情况下,
综上所述,整个算法的时间复杂度为 O(n)。
空间复杂度
-
频次数组:
- 使用一个长度为4的数组来存储每个字符的频次。空间复杂度为
O(1)。
- 使用一个长度为4的数组来存储每个字符的频次。空间复杂度为
-
差值数组:
- 使用一个长度为4的数组来存储每个字符的差值。空间复杂度为
O(1)。
- 使用一个长度为4的数组来存储每个字符的差值。空间复杂度为
-
窗口计数数组:
- 使用一个长度为4的数组来存储当前窗口内每个字符的频次。空间复杂度为
O(1)。
- 使用一个长度为4的数组来存储当前窗口内每个字符的频次。空间复杂度为
综上所述,整个算法的空间复杂度为 O(1)。
总结
- 时间复杂度:
O(n),其中n是字符串的长度。 - 空间复杂度:
O(1),因为使用的额外空间是固定大小的数组。