滑动窗口模板
注意:这里区间用的是左闭右开:[left, right)
void slidingWindow(String s) {
// 1、选合适的数据结构,记录窗口数据
HashMap<Character, Integer> window = new HashMap<>();
int left = 0, right = 0;
while (right < s.length()) {
// 2、右指针先动,移入窗口
char c = s.charAt(right);
window.put(c, window.getOrDefault(c, 0) + 1);
// 这里的联动与记忆不同,用的是左开右比把
right++;
...
// 3、判断左指针是否要移动
while (left < right && window needs shrink) {
char d = s.charAt(left);
window.put(d, window.get(d) - 1);
left++;
...
}
}
}
一道变化题
567. 字符串的排列
给你两个字符串 s1 和 s2 ,写一个函数来判断 s2 是否包含 s1 的排列。如果是,返回 true ;否则,返回 false 。
换句话说,s1 的排列之一是 s2 的 子串 。
示例1:
输入:s1 = "ab" s2 = "eidbaooo"
输出:true
解释:s2 包含 s1 的排列之一 ("ba").
示例2:
输入:s1= "ab" s2 = "eidboaoo"
输出:false
说明:1 <= s1.length, s2.length <= 104
public boolean checkInclusion(String s1, String s2) {
// 统计s1的字母个数
Map<Character,Integer> targetMap = new HashMap<>();
for(char target : s1.toCharArray()){
// TODO 这个+1千万别忘记啊
targetMap.put(target,targetMap.getOrDefault(target,0)+1);
}
Map<Character,Integer> windowMap = new HashMap<>();
int mapLen = 0;
int left=0,right=0;
while(right<s2.length()){
char rightCurr = s2.charAt(right);
if(targetMap.containsKey(rightCurr)){
windowMap.put(rightCurr, windowMap.getOrDefault(rightCurr,0)+1);
// Integer比较必须要用equals
if(windowMap.get(rightCurr).equals(targetMap.get(rightCurr))){
mapLen++;
// 目标值对比 要记住map是有size的
if(mapLen == targetMap.size()) return true;
}
}
right++;
// 判断左指针移动,这里标准应该用>=
while(right-left == s1.length()){
char leftCurr = s2.charAt(left);
if(targetMap.containsKey(leftCurr)){
if(windowMap.get(leftCurr).equals(targetMap.get(leftCurr))) mapLen--;
windowMap.put(leftCurr, windowMap.get(leftCurr)-1);
}
left++;
}
}
return false;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类