diff --git "a/\347\256\227\346\263\225\346\200\235\347\273\264\347\263\273\345\210\227/\346\273\221\345\212\250\347\252\227\345\217\243\346\212\200\345\267\247.md" "b/\347\256\227\346\263\225\346\200\235\347\273\264\347\263\273\345\210\227/\346\273\221\345\212\250\347\252\227\345\217\243\346\212\200\345\267\247.md" index 57a5d7a93c9f50e18b557c7d071eb326bdc65d00..7aac23fdf05097ec0f5fee27c1892353a4acbbbb 100644 --- "a/\347\256\227\346\263\225\346\200\235\347\273\264\347\263\273\345\210\227/\346\273\221\345\212\250\347\252\227\345\217\243\346\212\200\345\267\247.md" +++ "b/\347\256\227\346\263\225\346\200\235\347\273\264\347\263\273\345\210\227/\346\273\221\345\212\250\347\252\227\345\217\243\346\212\200\345\267\247.md" @@ -295,8 +295,47 @@ while (right < s.size()) { ![公众号 labuladong](../pictures/labuladong.png) +[Jiajun](https://github.com/liujiajun) 提供最小覆盖子串 Python3 代码: +```python3 +class Solution: + def minWindow(self, s: str, t: str) -> str: + # 最短子串开始位置和长度 + start, min_len = 0, float('Inf') + left, right = 0, 0 + res = s + + # 两个计数器 + needs = Counter(t) + window = collections.defaultdict(int) + # defaultdict在访问的key不存在的时候返回默认值0, 可以减少一次逻辑判断 + + match = 0 + + while right < len(s): + c1 = s[right] + if needs[c1] > 0: + window[c1] += 1 + if window[c1] == needs[c1]: + match += 1 + right += 1 + + while match == len(needs): + if right - left < min_len: + # 更新最小子串长度 + min_len = right - left + start = left + c2 = s[left] + if needs[c2] > 0: + window[c2] -= 1 + if window[c2] < needs[c2]: + match -= 1 + left += 1 + + return s[start:start+min_len] if min_len != float("Inf") else "" +``` + [上一篇:二分查找解题框架](../算法思维系列/二分查找详解.md) [下一篇:双指针技巧解题框架](../算法思维系列/双指针技巧.md) -[目录](../README.md#目录) \ No newline at end of file +[目录](../README.md#目录)