76. Minimum Window Substring (sliding window)
use two pointers (sliding window)
T :O(m+n)
S: O(|target|+|source|)
class Solution {
public String minWindow(String s, String t) {
int n = s.length();
Map<Character, Integer> sCounter = new HashMap<>(); // char, count
Map<Character, Integer> tCounter = new HashMap<>(); // char, count
// record target char, freq
for (char c : t.toCharArray()) {
tCounter.put(c, tCounter.getOrDefault(c, 0)+1);
}
int end = 0;
int charMatchedNum = 0;
int resStart = 0;
int resLen = Integer.MAX_VALUE; // for mini len result
for (int start = 0; start < n; start++) {
while (end < n && charMatchedNum < tCounter.size()) {
char c = s.charAt(end);
sCounter.put(c, sCounter.getOrDefault(c, 0)+1); // record source char, freq
// needs integer to int, unboxing not work
if ((int)sCounter.get(c) == (int)tCounter.getOrDefault(c,0)) { // if char freq equals, find matched
charMatchedNum++;
}
end++;
}
if (charMatchedNum == tCounter.size()) { // if matched count == target freq count, can get a result
if (resLen > end - start) { // but we want mini len of result
resStart = start; // result's start index
resLen = end - start; // result's len
}
}
char c = s.charAt(start);
sCounter.put(c, sCounter.getOrDefault(c,0)-1); // out of the start index loop,
// 如果兩者減1後, 相等, matched count應該 --
if ((int)sCounter.get(c) == (int)(tCounter.getOrDefault(c,0) - 1)) {
charMatchedNum--;
}
}
// 如果 resLen 還是最大值, 代表找不到
return resLen == Integer.MAX_VALUE ? "" : s.substring(resStart, resStart + resLen);
}
}Last updated
Was this helpful?