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);}}