76. 最小覆盖子串 - 力扣(LeetCode)
解法一:暴力遍历+哈希表
解法二:滑动窗口+哈希表
- 定义left和right初始化为零,固定left,先向右遍历right,放到哈希表中
- 这个时候我们需要统计有效字符的个数,就是指遍历的子串的种类等于 t 中的字符,就++
- 当遍历的子串里面的额有效字符的个数等于目标字符串的时候,就开始更新最小子串的结果
- 最后left向右移,维护count
代码:
public String minWindow(String ss, String tt) {
char[] s = ss.toCharArray();
char[] t = tt.toCharArray();
int[] hash1 = new int[128];
int[] hash2 = new int[128];
//tt中字符的种类
int m = 0;
for(char ch : t){
if(hash1[ch]++ == 0){
m++;
}
}
int minLen = Integer.MAX_VALUE;
int begin = -1;
for(int left = 0,right = 0,count = 0; right < s.length; right++){
char in = s[right];
//进窗口
hash2[in]++;
if(hash2[in] == hash1[in]){
count++;
}
//判断,当有效个数相等的时候
while(count == m){
//更新结果
if(right - left + 1 < minLen){
minLen = right - left + 1;
begin = left;
}
//出窗口
char out = s[left++];
if(hash2[out]-- == hash1[out]){
count--;
}
}
}
if(begin == -1){
return new String();
}else{
return ss.substring(begin,begin+minLen);
}
}