76. 最小覆盖子串:
题目链接 :76. 最小覆盖子串
题目:
给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 “” 。
思路:滑动窗口
- 先将子串t中出现元素存入hashMap,再遍历串s比较与t中重合的元素。
- 通过重合元素的个数来确立右侧边界,并且记录不重复的元素个数Vaild
- 当记录的元素个数达到了t串所需后,需要考虑左侧边界的收缩
- 左边界收缩时需要判断离开窗口的元素的出现次数是否是满足t串需求,如果满足t串需求,那么该元素在该次出窗口后达不到要求,则vaild-1,此时不满足vaild==t.length(),所以右侧窗口继续扩展。
AC代码:
class Solution {
public String minWindow(String s, String t) {
Map<Character,Integer> need=new HashMap<>();
Map<Character,Integer> win=new HashMap<>();
for(char c:t.toCharArray())
{
need.put(c,need.getOrDefault(c,0)+1);
}
int st=0,l=0,r=0,len=Integer.MAX_VALUE;
int valid=0;
while(r<s.length())
{
char c=s.charAt(r);
r++;
if(need.containsKey(c))
{
win.put(c,win.getOrDefault(c,0)+1);
if(win.get(c).equals(need.get(c)))
{
valid++;
}
}
while(valid==need.size())
{
if(len>r-l)
{
st=l;
len=r-l;
}
char c1=s.charAt(l);
l++;
if(need.containsKey(c1))
{
if(win.get(c1).equals(need.get(c1)))
{
valid--;
}
//
win.put(c1,win.getOrDefault(c1,0)-1);
}
}
}
return len==Integer.MAX_VALUE?"":s.substring(st,st+len);
}
}