题目
思路:滑动窗口
- 使用new int[128]数组保存t中每个字符出现的次数
- 使用new int[128]数组保存窗口中每个字符出现的次数
- 使用minLength表示最小子串长度。
- 使用count记录目前窗口中的有效字符数,当count == t.length()时,窗口长度为一个包含t中所有字符的子串的长度,更新minLength
- 窗口右移,直到窗口中包含有效字符数量小于t.length()
class Solution {
public String minWindow(String s, String t) {
if(s == null || s.length() == 0 || t == null || t.length() == 0 || s.length() < t.length()){
return "";
}
int[] needs = new int[128];
for(int i = 0; i < t.length();i++){
needs[t.charAt(i)]++;
}
int[] window = new int[128];
int count = 0;
int left = 0, right = 0, minLength = s.length() + 1;
String res = "";
while(right < s.length()){
char ch = s.charAt(right);
window[ch]++;
//t中有ch字符,且出现次数>=窗口中该字符的出现次数,为有效字符,count++
if(needs[ch] > 0 && needs[ch] >= window[ch]){
count++;
}
while(count == t.length()){
ch = s.charAt(left);
if(needs[ch] > 0 && needs[ch] >= window[ch]){
count--;
}
window[ch]--;
if(right - left + 1 < minLength){
minLength = right - left + 1;
res = s.substring(left,right+1);
}
left++;
}
right++;
}
return res;
}
}