class Solution {
public String minWindow(String s, String t) {
if (s == null || t == null || s.length() == 0 || t.length() == 0)
return "";
int[] freq = new int[128];//要匹配的字符的频次
char[] cht = t.toCharArray();
char[] chs = s.toCharArray();
int min = s.length()+1;
for(int i = 0;i < t.length(); i++){
freq[cht[i]]++;
}
int l = 0,r = 0,start = 0;
int count = 0;//已完成匹配的字符个数
while(r<s.length()){
//如果当前字符chs[r]是要匹配的字符,就让它频次-1;
//如果要匹配的字符频次-1后仍大于0,那么已完成匹配的字符个数就+1
if(--freq[chs[r]]>=0){
count++;
}
//窗口向右扩张
r++;
//如果已完成匹配了
while(count == t.length()){
int size = r-l;
//更新最小匹配长度
if(size<min){
start = l;
min = size;
}
//窗口左侧收缩,完成回退操作
if(++freq[chs[l]]>0){
count--;
}
l++;
}
}
//min长度不变则说明没找到。返回空串
if(min == s.length()+1){
return "";
}
return s.substring(start,start+min);
}
}
LeetCode日记 76.最小覆盖子串
最新推荐文章于 2024-05-20 14:02:07 发布