Given a string S and a string T, find the minimum window in S which will contain all the characters in T in complexity O(n).
For example,
S = "ADOBECODEBANC"
T = "ABC"
Minimum window is "BANC"
.
Note:
If there is no such window in S that covers all characters in T, return the emtpy string ""
.
If there are multiple such windows, you are guaranteed that there will always be only one unique minimum window in S.
The basic idea is this: we start looking in the source string, if until now we cannot find a char set of the target, keep looking. If we already find a char set, then we can get current window size and then continue looking for the next window. When looking for the next window, each time when we find a char in the target string, we can check if the window size can be decreased. Until doing this to the end of the source, we have the minimum size.
Let's see an example:
S: "ADOBECODEBANC" ; T: "ABC"
current char: "A" ; begin = 0, end = 0;
current char: "D" ; begin = 0, end = 1;
current char: "O" ; begin = 0, end = 2;
current char: "B" ; begin = 0, end = 3;
current char: "E" ; begin = 0, end = 4;
current char: "C" ; begin = 0, end = 5; minimum window size = 6, "ADOBEC"
current char: "O" ; begin = 0, end = 6;
current char: "D" ; begin = 0, end = 7;
current char: "E" ; begin = 0, end = 8;
current char: "B" ; begin = 0, end = 9; minimum window size = 6, "ADOBEC"
current char: "A" ; begin = 5, end = 10; minimum window size = 6, "ADOBEC"
current char: "N" ; begin = 5, end = 11;
current char: "C" ; begin = 9, end = 12; minimum window size = 4, "BANC"
C++ Code:
/* * func: min_window * goal: find the minimum window in S which will contain all characters in T * @param S: source string * @param T: target string * return: minimum window */ string min_window(string S, string T){ int len_s = S.length(); int len_t = T.length(); if(len_s < len_t){ return ""; } int char_dict_need[256]; int char_dict_found[256]; memset(char_dict_found, 0, 256 * sizeof(int)); memset(char_dict_need, 0, 256 * sizeof(int)); //Collect char needs to be found for(const char &ch : T){ char_dict_need[ch] += 1; } //variable for begin and end in S int begin = 0; int end = 0; //variable for begin and end in minimum windown of S int min_begin = 0; int min_end = len_s; //keep chars that have been found int count = 0; while(end < len_s){ //If current ch is needed if(char_dict_need[S[end]] != 0){ //record it in found dict ++char_dict_found[S[end]]; //Update count if(char_dict_found[S[end]] <= char_dict_need[S[end]]){ ++count; } //If one windown is found if(count == len_t){ //To see if begin index can be changed while(char_dict_need[S[begin]] == 0 || char_dict_need[S[begin]] < char_dict_found[S[begin]]){ if(char_dict_found[S[begin]] > char_dict_need[S[begin]]){ --char_dict_found[S[begin]]; } ++begin; } //Update minimum window if((end-begin + 1) < (min_end - min_begin + 1)){ min_begin = begin; min_end = end; } } } ++end; } if(count == len_t){ return S.substr(min_begin, min_end-min_begin+1); }else{ return ""; } }
Python Code:
# func: find the minimum window in S which will contain all chars in T # @param S: source string # @param T: target string # @return: minimum window def min_window(S, T): start = 0 end = 0 min_start = 0 min_end = len(S) count = 0 char_found = [0] * 256 char_need = [0] * 256 #Create char_need for ch in T: char_need[ord(ch)] += 1 while end < len(S): if char_need[ord(S[end])] > 0: #Update found dict char_found[ord(S[end])] += 1 #Update count if char_found[ord(S[end])] <= char_need[ord(S[end])]: count += 1 if count == len(T): #If the begin word is not what we need or it is in the dict #but we have more than what we need for now while char_need[ord(S[start])] == 0 or char_found[ord(S[start])] > char_need[ord(S[start])]: if char_found[ord(S[start])] > char_need[ord(S[start])]: char_found[ord(S[start])] -= 1 start += 1 #Update minimum window if (end-start+1) < (min_end-min_start+1): min_start = start min_end = end end += 1 if count == len(T): return S[min_start:min_end+1] else: return ''
Reference Link:
1. Finding the Minimum Window in S which Contains All Elements from T: http://leetcode.com/2010/11/finding-minimum-window-in-s-which.html
No comments:
Post a Comment