================ 567. 字符串的排列 ================
class Solution {
public boolean checkInclusion(String s1, String s2) {
HashMap<Character,Integer> need = new HashMap<>();
HashMap<Character,Integer> window = new HashMap<>();
for (int i = 0;i<s1.length();i++){
char p = s1.charAt(i);
need.put(p,need.getOrDefault(p,0)+1);
}
int left = 0;
int right = 0;
int valid = 0;//valid 变量表示满足 need 条件的字符个数
while(right<s2.length()){
char c = s2.charAt(right);
right++;
//进行窗口内数据的一系列更新,窗口向右扩大
if(need.containsKey(c)){
window.put(c,window.getOrDefault(c,0)+1);
if(window.get(c).equals(need.get(c))){
valid++;
}
}
//判断左侧窗口是否要收缩
while(right-left >= s1.length()){
//在这里判断是否找到了合法的子串
if (valid == need.size()){
return true;
}
char d = s2.charAt(left);
left++;
//进行窗口内数据的一系列更新
if(need.containsKey(d)){
if(window.get(d).equals(need.get(d))){
valid--;
}
window.put(d,window.getOrDefault(d,0)-1);
}
}
}
return false;
}
}
LeetCode 567. 字符串的排列-滑动窗口法-Java 解答
于 2022-07-19 16:22:37 首次发布