import java.util.HashMap;
class Solution {
public String minWindow(String s, String t) {
if (s.length() < t.length()) return "";
HashMap<Character, Integer> requiredCount = new HashMap<>();
for (char ch : t.toCharArray()) {
requiredCount.put(ch, requiredCount.getOrDefault(ch, 0) + 1);
}
HashMap<Character, Integer> windowCount = new HashMap<>();
int leftPointer = 0;
int rightPointer = 0;
int satisfiedChars = 0;
int totalRequiredUniqueChars = requiredCount.size();
int bestWindowLength = Integer.MAX_VALUE;
int bestWindowStart = 0;
while (rightPointer < s.length()) {
char currentChar = s.charAt(rightPointer);
windowCount.put(currentChar, windowCount.getOrDefault(currentChar, 0) + 1);
if (requiredCount.containsKey(currentChar) &&
windowCount.get(currentChar).intValue() == requiredCount.get(currentChar).intValue()) {
satisfiedChars++;
}
while (satisfiedChars == totalRequiredUniqueChars) {
int currentWindowLength = rightPointer - leftPointer + 1;
if (currentWindowLength < bestWindowLength) {
bestWindowLength = currentWindowLength;
bestWindowStart = leftPointer;
}
char leftChar = s.charAt(leftPointer);
windowCount.put(leftChar, windowCount.get(leftChar) - 1);
if (requiredCount.containsKey(leftChar) &&
windowCount.get(leftChar) < requiredCount.get(leftChar)) {
satisfiedChars--;
}
leftPointer++;
}
rightPointer++;
}
return bestWindowLength == Integer.MAX_VALUE
? ""
: s.substring(bestWindowStart, bestWindowStart + bestWindowLength);
}
}