描述
该题来自于力扣第76题
分析
该题简单在于能立刻想到应该使用滑动窗口解决,难点在于如何确定窗口刚好涵盖字符串t
;当然可以统计窗口中元素的个数与t
中的元素个数是否完全一致,但是这样每次对比都要遍历t
中所有不同元素,有没有更高效的方法呢?
为了描述方便,记cnt_map
是t
中字符与其个数的字典,window_cnt_map
是当前窗口中字符与其个数的字典,现看看窗口的左右端点是什么情况?
左端点:既然是求覆盖
t
的最小子串,那显然左端点的字符leftChar
总是在t
中,且左端点的字符个数window_cnt_map[leftChar]
必小于等于cnt_map[leftChar]
;右端点:右端点会遍历整个字符串
s
,遍历时需要记录当前窗口每个字符的个数即window_cnt_map
,同时如果右端点字符rightChar
在t
中,且window_cnt_map[rightChar]<=cnt_map[rightChar]
,记cnt
为有效的字符个数,表示窗口中涵盖t
中字符的个数,显然此时cnt
应该+1
,当cnt
等于t
的长度时就找到了一个涵盖t
的子串了。
这里cnt
只需要+1
操作的原因在于,左端点总是不包含多余的字符,保证了window_cnt_map
中的每个字符的个数不会减少,即cnt
不会减少,只会保持不变或者+1
,而需不需要+1
就是由右端点决定的。
遍历过程中可能会找到多个涵盖t
的子串,只要保留最小的那个就是结果。
代码
1 | class Solution: |