最常见的连续滑动窗口-Python



在练习python时,我遇到了滑动窗口技术,但不太了解它的实现。给定一个字符串k和整数N,代码将循环通过,从而将窗口从左向右移动。然而,窗口元素的捕获以及窗口如何增长对我来说是模糊的

Leetcode上的这些滑动窗口问题是相似的,但没有字母方面。

  1. 水果放入篮子:https://leetcode.com/problems/fruit-into-baskets/
  2. 不包含重复字符的最长子字符串:https://leetcode.com/problems/longest-substring-without-repeating-characters/
  3. 替换k个后最长的子字符串:https://leetcode.com/problems/longest-repeating-character-replacement/
  4. 字符串中的置换:https://leetcode.com/problems/permutation-in-string/
  5. 字符串变位符:https://leetcode.com/problems/find-all-anagrams-in-a-string/
  6. 大小为k的任何连续子数组的平均值:https://leetcode.com/problems/maximum-average-subarray-i/
  7. 大小为k的任何连续子数组的最大和:https://leetcode.com/problems/maximum-subarray/
  8. 给定和的最小子数组:https://leetcode.com/problems/minimum-size-subarray-sum/
  9. 具有k个不同字符的最长子字符串:https://leetcode.com/problems/longest-substring-with-at-most-k-distinct-characters/

这里出现最多的连续子字符串定义为增长序列中的三个字母。例如,对于"cdegoxyzcga"的输入字符串k和长度为3的N,输出将是[cde,xyz]。

result = {}
input = 2;
inputString = "abrtidyzabfo"
for i in range(0, len(inputString)):
if i >= input-1:
current = inputString[i+1-input: i+1]
if current in result:
result[current] = result[current] + 1 
else:
result[current] = 1
print(result)

您可以使用字典来跟踪出现与否的特定子字符串。这种方法被称为";滑动窗口算法";。此时,复杂性将为O(n(,因为您只运行一次循环。

您可以在滚动字符串时使用Counter来收集计数:

s = 'abrtidyzabfo'
n = 2
from collections import Counter
c = Counter(s[i:i+n] for i in range (len(s)-n+1))
out = c.most_common(1)[0][0]

输出:'ab'

注意。可能存在多于1〃的;最频繁的";一串查看全部:

c = Counter(s[i:i+n] for i in range (len(s)-n+1))
out = []
MAX = 0
for x, i in c.most_common():
if i > MAX:
out = [x]
MAX = i
elif i == MAX:
out.append(x)
out

使用s = "abrtidyzabfody"作为输入的示例:

['ab', 'dy']

最新更新