5 条题解

  • 1
    @ 2026-6-2 16:17:20

    根据大佬给出的O(n)做法的思路,提供一种python实现

    def check(start, end):
        cnt = 0
        for i in range(26):
            if lst[i][end-1] - (lst[i][start-2] if start >= 2 else 0) == k:
                cnt += 1
        return cnt
    
    n, k = map(int,input().split(" "))
    inp = input()
    lst = [[0] * n for i in range(26)]
    #n列,26行(第一列为0)
    for i in range(26):
        letter = chr(ord('a') + i)
        for j in range(len(inp)):
            if letter == inp[j]:
                lst[i][j] = lst[i][j-1] + 1
            else:
                lst[i][j] = lst[i][j-1]
    ans = 0
    for i in range(1,27):
        length = i * k
        for j in range(length,n + 1):
            l = j - length + 1
            r = j
            if check(l, r) == i:
                ans += 1
    print(ans)
    

    信息

    ID
    170
    时间
    1000ms
    内存
    256MiB
    难度
    普及
    标签
    递交数
    760
    已通过
    184
    上传者