描述
给出两个字符串 s 和 t,要求在 s 中找出最短的包含 t 中所有字符的连续子串。
题目解法:利用哈希表进行求解,并利用Hashmap的getOrDefault()函数,对hashmap
中的key值进行统计,并记得要考虑T模板中有多个重复值的情况。
public class Solution {
/**
*
* @param S string字符串
* @param T string字符串
* @return string字符串
*/
public String minWindow (String S, String T) {
// write code here
HashMap<Character,Integer> need=new HashMap<>();
HashMap<Character,Integer> window=new HashMap<>();
for(int i=0;i<T.length();i++)
{
char c=T.charAt(i);
need.put(c,need.getOrDefault(c,0)+1);
}
int start=0;
int minlen=Integer.MAX_VALUE;
int left=0,right=0;
int valid=0;
while(right<S.length())
{
char c=S.charAt(right);
right++;
if(need.containsKey(c))
{
window.put(c,window.getOrDefault(c,0)+1);
if(need.get(c)==window.get(c))
{valid++;}
}
while(valid==need.size())
{
if(right-left<minlen)
{
start=left;
minlen=right-left;
}
char d=S.charAt(left);
left++;
if(need.containsKey(d))
{
if(need.get(d)==window.get(d))
{
valid--;
}
window.put(d,window.getOrDefault(d,0)-1);
}
}
}
return minlen==Integer.MAX_VALUE? "":S.substring(start,start+minlen);
}
}