Sliding windows find the min/max
Substring - Here is a 10-line template that can solve most 'substring' problems
1. Use two pointers: start and end to represent a window.
2. Move end to find a valid window.
3. When a valid window is found, move start to find a smaller window.
針對不可能單控制end就找到valid windows的case:
1. Use two pointers: start and end to represent a window.
2. Move end to find a possible valid window.
3. When a possible valid window is found, try to move start to make it real valid
4. If we can't find a valid window, restore the start to 0.
ex: No. 395
Here comes the template.
For most substring problem, we are given a string and need to find a substring of it which satisfy some restrictions. A general way is to use a hashmap assisted with two pointers. The template is given below.
int findSubstring(string s){
vector<int> map(128,0);
int counter; // check whether the substring is valid
int begin=0, end=0; //two pointers, one point to tail and one head
int d; //the length of substring
for() { /* initialize the hash map here */ }
while(end<s.size()){
if(map[s[end++]]-- ?){ /* modify counter here */ }
while(/* counter condition */){
/* update d here if finding minimum*/
//increase begin to make it invalid/valid again
if(map[s[begin++]]++ ?){ /*modify counter here*/ }
}
/* update d here if finding maximum*/
}
return d;
}
One thing needs to be mentioned is that when asked to find maximum substring, we should update maximum after the inner while loop to guarantee that the substring is valid. On the other hand, when asked to find minimum substring, we should update minimum inside the inner while loop.
The code of solving Longest Substring with At Most K Distinct Characters is below:
public int lengthOfLongestSubstringKDistinct(String s, int k) {
int[] map = new int[256];
int start = 0, end = 0, maxLen = Integer.MIN_VALUE, counter = 0;
while (end < s.length()) {
final char c1 = s.charAt(end);
if (map[c1] == 0) counter++;
map[c1]++;
end++;
while (counter > k) {
final char c2 = s.charAt(start);
if (map[c2] == 1) counter--;
map[c2]--;
start++;
}
maxLen = Math.max(maxLen, end - start);
}
return maxLen;
}
The code of solving Longest Substring Without Repeating Characters is below:
public int lengthOfLongestSubstring2(String s) {
int[] map = new int[128];
int start = 0, end = 0, maxLen = 0, counter = 0;
while (end < s.length()) {
final char c1 = s.charAt(end);
if (map[c1] > 0) counter++;
map[c1]++;
end++;
while (counter > 0) {
final char c2 = s.charAt(start);
if (map[c2] > 1) counter--;
map[c2]--;
start++;
}
maxLen = Math.max(maxLen, end - start);
}
return maxLen;
}
Last updated
Was this helpful?