class Solution {
public String minWindow(String s, String t) {
int[] map = new int[128];
for(Character ch : t.toCharArray()){
map[ch]++;
}
//定义counter来计数,begin/end作为滑动窗口的两端,d表示滑动窗口长度,head来记录满足条件的起始位置,len表示s字符串长度
int counter = t.length();
int begin = 0, end = 0, head = 0, d = Integer.MAX_VALUE;
int len = s.length();
while(end < len){
//若遇到与t字符串中相同元素,计数减一
if(map[s.charAt(end)] > 0){
counter--;
}
//该元素计数减一
map[s.charAt(end)]--;
//滑动窗口右端后移
end++;
//直到窗口内包含t中所有元素
while(counter == 0){
//若当前滑动窗口长度较小,则记录当前滑动窗口的长度及起始位置
if(end - begin < d){
d = end - begin;
head = begin;
//进一步优化一下,如果当前滑动窗口大小与t子串长度一样长,直接返回结果即可。
if(d == t.length()){
return s.substring(head, head + d);
}
}
//重新调整滑动窗口
if(map[s.charAt(begin)] == 0){
counter++;
}
//恢复状态
map[s.charAt(begin)]++;
//滑动窗口左端向右侧移动
begin++;
}
}
return d == Integer.MAX_VALUE ? "" : s.substring(head, head + d);
}
}
leetcode76. Minimum Window Substring
最新推荐文章于 2020-04-23 13:11:31 发布