AlgoDesign

Smallest subarray covering set

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