7.最小替换子串长度

120 阅读3分钟

问题描述

给定一个只包含字符ASDF的字符串,且字符串长度总是4的倍数。任务是通过尽可能少的替换,使得ASDF这四个字符在字符串中出现的频次相等。求出实现这一条件的最小子串长度。

解题思路

  1. 目标频次计算

    • 由于字符串长度总是4的倍数,目标频次可以通过将字符串长度除以4得到。
    • 例如,字符串长度为16,则目标频次为4。
  2. 统计当前频次

    • 使用一个数组freq来统计每个字符ASDF的当前频次。
    • 遍历字符串,将每个字符的频次累加到freq数组中。
  3. 计算差值

    • 使用一个数组diff来存储每个字符当前频次与目标频次的差值。
    • 如果某个字符的当前频次小于目标频次,则差值为0(因为不需要增加该字符的频次)。
  4. 滑动窗口技术

    • 使用两个指针leftright来表示窗口的左右边界。
    • 扩展窗口:将right指针向右移动,并更新窗口内字符的频次。
    • 检查窗口是否满足条件:如果窗口内的字符频次满足差值要求,则记录当前窗口长度,并尝试缩小窗口。
    • 缩小窗口:将left指针向右移动,并更新窗口内字符的频次。
  5. 返回结果

    • 最终返回满足条件的最小窗口长度。

444.png

555.png

关键点总结

  1. 目标频次计算:通过字符串长度除以4得到目标频次。
  2. 频次统计与差值计算:使用数组统计当前频次,并计算每个字符的差值。
  3. 滑动窗口技术:通过扩展和缩小窗口来找到满足条件的最小子串。
  4. 边界条件处理:如果所有字符的频次已经相等,直接返回0。
  5. 复杂度分析

时间复杂度

  1. 初始频次统计

    • 遍历整个字符串一次,统计每个字符的频次。时间复杂度为 O(n),其中 n 是字符串的长度。
  2. 差值计算

    • 遍历频次数组一次,计算每个字符的差值。时间复杂度为 O(1),因为频次数组的长度固定为4。
  3. 滑动窗口

    • 使用滑动窗口技术来找到满足条件的最小子串。在最坏情况下,right 指针会遍历整个字符串一次,left 指针也会遍历整个字符串一次。因此,滑动窗口的时间复杂度为 O(n)

综上所述,整个算法的时间复杂度为 O(n)

空间复杂度

  1. 频次数组

    • 使用一个长度为4的数组来存储每个字符的频次。空间复杂度为 O(1)
  2. 差值数组

    • 使用一个长度为4的数组来存储每个字符的差值。空间复杂度为 O(1)
  3. 窗口计数数组

    • 使用一个长度为4的数组来存储当前窗口内每个字符的频次。空间复杂度为 O(1)

综上所述,整个算法的空间复杂度为 O(1)

总结

  • 时间复杂度O(n),其中 n 是字符串的长度。
  • 空间复杂度O(1),因为使用的额外空间是固定大小的数组。