LeetCode76 最小覆盖子串
滑动窗口+map
设定左右双指针,若滑动窗口内不包含t中所有的字符则右指针右移,若包含t所有字符则左指针右移同时更新最小值和对应边界直到不包含所有的,以此循环直到s的最后
- 时间复杂度:O(C*m+n),m为s的长度
- 空间复杂度:O(C),C为t的长度
class Solution {
Map<Character,Integer> need = new HashMap<>();
Map<Character,Integer> have = new HashMap<>();
public String minWindow(String s, String t) {
int sLen = s.length(),tLen = t.length();
for(int i=0;i<tLen;i++){
char c = t.charAt(i);
need.put(c,need.getOrDefault(c,0)+1);
}
int l = 0,r = 0,length = 0;
int ansL = -1,ansR = -1,min = Integer.MAX_VALUE;
while(r<sLen){
char cur = s.charAt(r);
have.put(cur,have.getOrDefault(cur,0)+1);
r++;
while (check()&&l<r){
if(min>r-l+1){
min = r-l+1;
ansL = l;
ansR = r;
}
char cl = s.charAt(l);
have.put(cl,have.getOrDefault(cl,0)-1);
l++;
}
}
return ansL==-1?"":s.substring(ansL,ansR);
}
private boolean check(){
for(char c:need.keySet()){
int count = have.getOrDefault(c,0);
if(count<need.get(c)){
return false;
}
}
return true;
}
}
滑动窗口+数组
滑动窗口采用map保存字符和个数,可用数组代替map优化空间复杂度
- 时间复杂度:O(C*m+n)
- 空间复杂度:O(C)
class Solution {
public String minWindow(String s, String t) {
int sLen = s.length(),tLen = t.length();
int[] need = new int[128] , have = new int[128];
int l = 0,r = 0,length = 0;
int ansL = -1,ansR = -1,min = Integer.MAX_VALUE;
for(int i=0;i<tLen;i++){
need[t.charAt(i)]++;
}
while(r<sLen){
char c = s.charAt(r);
have[c]++;
r++;
if(have[c]<=need[c]){
length++;
}
while (length==tLen&&l<r){
if(min>r-l+1){
min = r-l+1;
ansL = l;
ansR = r;
}
char cl = s.charAt(l);
have[cl]--;
l++;
if(have[cl]<need[cl]){
length--;
}
}
}
return ansL==-1?"":s.substring(ansL,ansR);
}
}
分类:
LeetCode Hot100
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理