问题描述:给你一个字符串s,一个字符串t,返回s中涵盖t所有字符的最小子串,如果s中不存在涵盖t所有字符的子串,则返回空的字符串。注意:如果s中存在这样的子串,保证他是唯一存在的。
求解思路:存在性问题,先用map将t中所有字符进行数量统计,然后定义left和right指针指向s的第一个字符,在while循环中进行处理,首先将右指针所指向的字符放入map中进行更新,若在map中存在该字符,则将其值减去1,然后右指针右移,并检查map,是否将t中所有字符包含,若是则保存当前长度,并不停左移指针,直到不能包含t中所有字符为止,然后继续指针右移,直到无法右移为止。
public Boolean check(Map<Character,Integer> map)
{
for(int value:map.values())
{
if(value>0)return false;
}
???????return true;
}
public String minSub(String s,String t)
{
int start=0;
int end=0;
|int startIndex;
int endIndex;
Map<Character,Integer>map=new HashMap<>();
int minLength=Integer.MAX_VALUE;
for(char ch:t.toCharArray())
{
map.put(ch,map.getOrDefault(ch,0)+1);
}
while(right<s.length())
{
if(map.containsKey(s.charAt(right)))
{
map.put(s.charAt(right),map.getOrDefalt(s.charAt(right),0)-1);
}
while(check(map))
{
if(right-left+1<minLength)
{
minLength=right-left+1;
startIndex=left;
endIndex=right;
}
if(map.containsKey(s.charAt(right)))
{
map.put(s.charAt(left),map.getOrDefault(s.charAt(left),0)+1);
}
left++;
}
right++;
}
if(minLength!=Integer.MAX_VALUE)
{
return s.substring(startIndex,endIndex+1);
}else{
return "";
}
}