标签:bre == 存储 否则 false 记录 次数 str 需要
class Solution { public:
//考虑到s完全包含t bool is_windwo_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) { //用来存储字符串中对应的map结构 int map_t[128] = {0}; int map_s[128] = {0}; vector<int> vec_t; for(int i=0; i<t.size(); ++i) map_t[t[i]]++; // 只需要记录出现过一次的字符就可以了,没必要记录出现次数超过一次的字符 for(int i=0; i<128; ++i) { if(map_t[i] > 0) vec_t.push_back(i); } int window_beg = 0; string result; for(int i=0; i<s.size(); ++i) { map_s[s[i]]++; //每向前移动一步,尝试移动头指针 while(window_beg < i) { char begin_ch = s[window_beg]; if(map_t[begin_ch] == 0)//没有出现过 { window_beg++; } else if(map_s[begin_ch] > map_t[begin_ch])//大于map_t中出现的次数 { map_s[begin_ch]--; window_beg++; } else { break;//否则就表明不能在往前移动了 } } //尝试更新此窗口是否包含字符串t if(is_windwo_ok(map_s, map_t, vec_t)) { int new_window_len = i-window_beg + 1; if(result == "" || result.size() > new_window_len) { result = s.substr(window_beg, new_window_len); } } } return result; } };
标签:bre == 存储 否则 false 记录 次数 str 需要
原文地址:https://www.cnblogs.com/randyniu/p/9355904.html