76. Minimum Window Substring

给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串

输入:s = "ADOBECODEBANC", t = "ABC"
输出:"BANC"
解释:最小覆盖子串 "BANC" 包含来自字符串 t 的 'A'、'B' 和 'C'。

 

public String minWindow(String s, String t) {
if (s == null || t == null || s.length() < t.length())
return "";
// HashMap的key为t中各个字符,value为对应字符个数
Map<Character, Integer> map = new HashMap<>();
for (char c : t.toCharArray()) {
map.put(c, map.getOrDefault(c, 0) + 1);
}
// minLeft为最小窗口左下标,minLen为最小长度,count用来计数,表示目前有多少个字符和t匹配
int minLenLeft = 0;
int minLen = Integer.MAX_VALUE;
int count = 0;
int left = 0; // 窗口的左坐标
for (int i = 0; i < s.length(); i++) {
char ch = s.charAt(i);
if (map.containsKey(ch)) {
// 如果map.get(ch)>0,计数器+1
if (map.get(ch) > 0){
count++;
}
map.put(ch, map.get(ch) - 1);
}
// 如果left到i中包含t中所有字符,可以计算下minLen
while (count == t.length()) {
if (i - left + 1 < minLen) {
minLenLeft = left;
minLen = i - left + 1;
}
// 模拟窗口向右滑动,需要处理最左边的字符
ch = s.charAt(left);
if (map.containsKey(ch)) {
// 该字符不在窗口范围内了,map中对应字符的频次要加1
map.put(ch, map.get(ch) + 1);
if (map.get(ch) > 0)
count--;
}
// 窗口右滑
left++;
}
}
if (minLen > s.length())
return "";

return s.substring(minLenLeft, minLenLeft + minLen);
}
posted @   MarkLeeBYR  阅读(28)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示