1from collections import namedtuple, Counter
2class Solution:
3 def smallestSubarrayCoveringSet(self, paragraph, keywords):
4 dist = namedtuple("dist", ("start", "end"))
5 keywordsCounter = Counter(keywords)
6 start, res, keywordsToCover = 0, dist(-1, -1), len(keywords)
7
8 for end in range(0, len(paragraph)):
9 if paragraph[end] in keywords:
10 keywordsCounter[paragraph[end]] -= 1
11 if keywordsCounter[paragraph[end]] >= 0: keywordsToCover -= 1
12
13 while keywordsToCover == 0:
14 if res == dist(-1, -1) or res.end - res.start > end - start: res = dist(start, end)
15 if paragraph[start] in keywords:
16 keywordsCounter[paragraph[start]] += 1
17 if keywordsCounter[paragraph[start]] >= 0: keywordsToCover += 1
18 start += 1
19
20 return res
21