LeetCode刷题-76. 最小覆盖子串
题目链接:76. 最小覆盖子串
¶题解:
滑动窗口界的一大难题!
¶题目简述:
给定两个字符串,从一个串找到包含另一个字符串所有字符的子串,并找到最短的一个!
¶题解:
双指针算法:
两个指针都从起点从左向右,i
指针指向该区间终点,j
指针指向该区间起点,维护一段区间i ~ j
使得该区间包含待匹配字符串的每个字符。
具体做法:
- 为了判断该区间是否包含待匹配字符串的每个字符,我们使用一个哈希表动态存储该区间每个字符出现的次数
- 使用变量
cnt
统计该区间有效字符个数(即待匹配字符串中对应匹配的字符),只要该区间当前字符个数小于等于待匹配字符串的当前字符个数,即为有效字符,进行统计,即hs[s[j]] <= ht[s[j]]
- 维护起点
j
,若新加入的字符导致hs[s[j]] > ht[s[j]]
,则说明起点j
可以后移,即hs[s[j ++ ]] --
,还得保证起点j
一定是一个合法字符(即起点一定不是待匹配字符串没有的字符,如:ADOBECODEBA
匹配ABC
,应该要将起点A
删去,再将DOBECODE
删去。剩下BA
,即这里是需要while
来控制的) - 当
cnt == t.size()
:即该区间已经匹配,进行更新res
即可,res
为空也要更新!
使用双指针算法的条件:一定要有单调性,即一个指针后移,另一个指针也要后移!
对于本题:i' < i, j < j'
时,当i
向后走到i'
,由于原来的j ~ i
已经匹配,所以j
一定不会往前走到j'
,即j
一定会不动或者向后走,这样就保证了单调性!
时间复杂度: O(n)
¶AC代码:
1 |
|
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 小牛博客!
评论