// 判断 s 中是否存在 t 的排列
bool checkInclusion(string t, string s) {
unordered_map<char, int> need, window;
for (char c : t) need[c]++;
int left = 0, right = 0;
int valid = 0;
while (right < s.size()) {
char c = s[right];
right++;
// 进行窗口内数据的一系列更新
if (need.count(c)) {
window[c]++;
if (window[c] == need[c])
valid++;
}
// 判断左侧窗口是否要收缩
while (right - left >= t.size()) {
// 在这里判断是否找到了合法的子串
if (valid == need.size())
return true;
char d = s[left];
left++;
// 进行窗口内数据的一系列更新
if (need.count(d)) {
if (window[d] == need[d])
valid--;
window[d]--;
}
}
}
// 未找到符合条件的子串
return false;
}
JAVA Version:
class Solution {
public boolean checkInclusion(String s1, String s2) {
Map<Character,Integer> needs = new HashMap<Character,Integer>();
HashMap<Character, Integer> windows = new HashMap<Character, Integer>();
for(int i = 0;i< s1.length(); i++)
{
needs.put(s1.charAt(i), needs.getOrDefault(s1.charAt(i), 0)+1);
}
char[] elements= s2.toCharArray();
int windowSize = s1.length();
int start = 0;
int end = 0;
int validLetter = 0;
while(end< s2.length())
{
char currentEnd = s2.charAt(end);
end++;
if(needs.containsKey(currentEnd))
{
windows.put(currentEnd, windows.getOrDefault(currentEnd, 0)+1);
if(needs.get(currentEnd).equals(windows.get(currentEnd)))
{
validLetter++;
}
}
while(validLetter == needs.size())
{
if(end-start == s1.length()) return true;
char currentStart = s2.charAt(start);
start++;
if(needs.containsKey(currentStart))
{
if(needs.get(currentStart).equals(windows.get(currentStart)))
{
validLetter--;
}
windows.put(currentStart, windows.get(currentStart)-1);
}
}
}
return false;
}
}