Leetcode 76 Minimum Window Substring. (最小窗口子字符串) (滑动窗口, 双指针)
** Leetcode 76 **
问题描述
Given a string S and a string T, find the minimum window in S which will contain all the characters in T in complexity O(n).
例子
Example:
Input: S = "ADOBECODEBANC", T = "ABC"
Output: "BANC"
解决方案
** Solution Java Method one **
** 3ms, beats 92.14% **
** 39.8MB, beats 46.81% **
class Solution {
public String minWindow(String s, String t) {
if (s == null || s.length() == 0 || s.length() < t.length())
return "";
char[] sArray = s.toCharArray();
char[] tArray = t.toCharArray();
int[] map = new int[256];
for (int i = 0; i < tArray.length; ++i)
++map[tArray[i]];
int minStart = 0, start = 0;
int count = tArray.length;
int minLength = Integer.MAX_VALUE;
for (int end = 0; end < sArray.length; ++end) {
if (map[sArray[end]] > 0)
--count;
--map[sArray[end]];
while (count == 0) {
if (end - start + 1 < minLength) {
minStart = start;
minLength = end - start + 1;
}
++map[sArray[start]];
if (map[sArray[start]] > 0)
++count;
++start;
}
}
if (minStart + minLength > sArray.length)
return "";
return s.substring(minStart, minStart + minLength);
}
}
** Solution Java Method Two **
** 12ms, 68.18% **
** 39.8MB, 46.81% **
class Solution {
public String minWindow(String s, String t) {
if (s == null || s.length() == 0 || s.length() < t.length())
return "";
Map<Character, Integer> map = new HashMap<>();
char[] tArray = t.toCharArray();
char[] sArray = s.toCharArray();
for(char chr : tArray)
map.put(chr, map.getOrDefault(chr, 0) + 1);
int count = tArray.length;
int minStart = 0, minLength = Integer.MAX_VALUE;
int start = 0;
for(int end = 0; end < sArray.length; ++end){
char chr = sArray[end];
if (map.containsKey(chr)) {
map.put(chr, map.get(chr) - 1);
if (0 <= map.get(chr))
--count;
}
while (count == 0){
if (end - start + 1 < minLength) {
minStart = start;
minLength = end - start + 1;
}
if (map.containsKey(sArray[start])) {
map.put(sArray[start], map.get(sArray[start]) + 1);
if (map.get(sArray[start]) > 0)
++count;
}
++start;
}
}
if (minStart + minLength > sArray.length)
return "";
return s.substring(minStart, minStart + minLength);
}
}
** Solution Python3 **
** 96ms, beats 86.89% **
** 13.3MB, beats 61.11% **
class Solution:
def minWindow(self, s, t):
need, missing = collections.Counter(t), len(t)
i = I = J = 0
for j, c in enumerate(s, 1):
missing -= need[c] > 0
need[c] -= 1
if not missing:
while need[s[i]] < 0: need[s[i]] += 1; i += 1
if not J or j - i <= J - I: I, J = i, j
need[s[i]] += 1; i += 1; missing += 1
return s[I : J]
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
· 如何给本地部署的DeepSeek投喂数据,让他更懂你
· 超详细,DeepSeek 接入PyCharm实现AI编程!(支持本地部署DeepSeek及官方Dee
· 用 DeepSeek 给对象做个网站,她一定感动坏了
· .NET 8.0 + Linux 香橙派,实现高效的 IoT 数据采集与控制解决方案
· .NET中 泛型 + 依赖注入 的实现与应用