76. Minimum Window Substring
Hard
1934130FavoriteShare
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).
Example:
Input: S = "ADOBECODEBANC", T = "ABC" Output: "BANC"
Note:
- If there is no such window in S that covers all characters in T, return the empty string
"". - If there is such window, you are guaranteed that there will always be only one unique minimum window in S.
题意:

题解:

class Solution {
public:
bool is_window_ok(int map_s[], int map_t[], vector<int>& vec_t){
for (int i = 0; i < vec_t.size(); i++){
if(map_s[vec_t[i]] < map_t[vec_t[i]]){
return false;
}
}
return true;
}
string minWindow(string s, string t) {
const int MAX_ARRAY_LEN = 128;
int map_t[MAX_ARRAY_LEN] = {0};
int map_s[MAX_ARRAY_LEN] = {0};
vector<int> vec_t;
for (int i = 0; i < t.length(); i++){
map_t[t[i]]++;
}
for (int i = 0; i < MAX_ARRAY_LEN; i++){
if(map_t[i] > 0){
vec_t.push_back(i);
}
}
int window_begin = 0;
string result = "";
for (int i = 0; i < s.length(); i++){
map_s[s[i]]++;
while(window_begin < i){
if(map_t[s[window_begin]] == 0){
window_begin++;
} else if(map_s[s[window_begin]] > map_t[s[window_begin]]){
map_s[s[window_begin]]--;
window_begin++;
} else {
break;
}
}
if(is_window_ok(map_s, map_t, vec_t)){
if(result == "" || result.size() > (i - window_begin + 1)){
result = s.substr(window_begin, i - window_begin + 1);
}
}
}
return result;
}
};
本文深入探讨了在复杂度为O(n)下寻找包含所有目标字符的最小子串问题,通过具体实例“ADOBECODEBANC”与“ABC”,详细解释了一种高效算法的实现过程。该算法首先构建目标字符串的字符频率映射,然后遍历源字符串,动态调整窗口大小,直至找到符合条件的最短子串。
233

被折叠的 条评论
为什么被折叠?



