最小替换子串长度 | 豆包MarsCode AI刷题

71 阅读2分钟

问题描述

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

测试样例

样例1:

输入:input = "ADDF"
输出:1

样例2:

输入:input = "ASAFASAFADDD"
输出:3

样例3:

输入:input = "SSDDFFFFAAAS"
输出:1

样例4:

输入:input = "AAAASSSSDDDDFFFF"
输出:0

样例5:

输入:input = "AAAADDDDAAAASSSS"
输出:4

def solution(input):
    # Please write your code here
    numa = input.count('A')
    nums = input.count('S')
    numd = input.count('D')
    numf = input.count('F')
    n = int(len(input)/4)
    length = max(numa, numd, nums, numf) - n
    for i in range(length, len(input)):
        for j in range(len(input)-i+1):
            a = numa - input[j: j+i].count('A')
            s = nums - input[j: j+i].count('S')
            d = numd - input[j: j+i].count('D')
            f = numf - input[j: j+i].count('F')
            if max(a,s,d,f) <= n:
                return i



if __name__ == "__main__":
    #  You can add more test cases here
    # print(solution("ADDF") == 1 )
    print(solution("AFAFSSFDSFFF") == 3)

问题理解

题目要求我们通过尽可能少的替换,使得字符串中字符 ASDF 出现的频次相等。字符串的长度总是4的倍数,因此每个字符应该出现的次数是 n = len(input) // 4

数据结构选择

  1. 计数器

    • 使用计数器来统计字符 ASDF 在字符串中出现的次数。
  2. 滑动窗口

    • 使用滑动窗口来动态计算子串中字符的计数,避免重复计算。

算法步骤

  1. 初始化计数器

    • 统计字符 ASDF 在字符串中出现的次数。
  2. 计算每个字符需要替换的次数

    • 计算每个字符需要替换的次数,即 max(0, count - n),其中 count 是字符的当前计数,n 是每个字符应该出现的次数。
  3. 滑动窗口初始化

    • 初始化滑动窗口的左右指针 leftright,并初始化当前窗口中字符的计数器。
  4. 滑动窗口遍历

    • 遍历字符串,每次将右指针 right 向右移动,并更新当前窗口中字符的计数。
    • 检查当前窗口是否满足替换条件,即当前窗口中每个字符的计数是否大于等于需要替换的次数。
    • 如果满足条件,记录当前窗口的长度,并将左指针 left 向右移动,缩小窗口,继续检查是否有更小的子串满足条件。
  5. 返回最小长度

    • 返回找到的最小子串长度。

总结

通过使用滑动窗口和计数器,可以有效地找到满足条件的最小子串长度。滑动窗口避免了重复计算子串中字符的计数,从而提高了算法的效率。