import java.util.HashMap;
import java.util.Map;
public class SubstringTemplate {
public int findSubstring(String s) {
Map<Character, Integer> map = new HashMap<>();
int counter = 0; // Check whether the substring is valid
int begin = 0, end = 0; // Two pointers, one points to tail and one to head
int d = 0; // The length of the substring
// Initialize the hash map here
for (char c : s.toCharArray()) {
map.put(c, 0);
}
while (end < s.length()) {
// Modify counter here
if (map.containsKey(s.charAt(end)) && map.get(s.charAt(end))-- > 0) {
counter--;
}
// Counter condition
while (counter == 0) {
// Update d here if finding minimum
if (/* some condition */) {
d = end - begin;
}
// Increase begin to make it invalid/valid again
if (map.containsKey(s.charAt(begin)) && map.get(s.charAt(begin))++ == 0) {
counter++;
}
begin++;
}
end++;
// Update d here if finding maximum or minimum
}
return d;
}
}