📅  最后修改于: 2023-12-03 15:21:38.132000             🧑  作者: Mango
给定一个字符串s,对于每个查询,我们可以选择任何长度为k的连续子字符串,并询问字符串中这样的子字符串的数量。请求出每个查询的答案。
枚举每个查询,对于每个查询,可以通过滑动窗口的方式,在O(n)的时间内求出答案。
具体来说,对于一个长度为n的字符串s,如果要求长度为k的子字符串的出现次数,可以用一个长度为k的窗口,从左往右遍历字符串s,每次移动窗口,判断窗口中的字符串是否为目标子字符串。时间复杂度为O(n)。
我们可以将这个方法用于每个查询中,对于每个查询,都可以在O(n)的时间复杂度内求解。
具体实现如下所示:
def count_substrings(s: str, k: int, queries: List[Tuple[int, int]]) -> List[int]:
res = []
for query in queries:
left, right = query
window = s[left-1:left+k-1]
count = 0
for i in range(left-1, right-k+1):
if s[i:i+k] == window:
count += 1
res.append(count)
return res
对于每个查询,时间复杂度为O(n),总的时间复杂度为O(nq),其中q为查询的个数,空间复杂度为O(1)。
本题可以通过滑动窗口的方式在O(n)的时间复杂度内解决,需要注意查询的区间是左闭右闭区间,在实现中需要做一些处理。