string minWindow(string s, string t) { if(s.length() < t.length()) return ""; const int ASCII_SIZE = 256; vector<int> appeared_count(ASCII_SIZE, 0); vector<int> expected_count(ASCII_SIZE, 0); for(auto c:t) expected_count[c]++; int min_width=INT_MAX, min_start=0, win_start=0, appeared=0; for(size_t win_end=0; win_end<s.length(); win_end++) { char c = s[win_end]; if(expected_count[c]>0) { appeared_count[c]++; if(appeared_count[c] <= expected_count[c]) appeared++; } if(appeared == t.length()) { while(appeared_count[s[win_start]]>expected_count[s[win_start]] || expected_count[s[win_start]]==0) { appeared_count[s[win_start]]--; win_start++; } if(min_width > (win_end-win_start+1)) { min_width = win_end-win_start+1; min_start = win_start; } } } return min_width == INT_MAX ? "" : s.substr(min_start, min_width); }
inline std::size_t operator+=(const std::size_t increment) { m_count += increment; on_progress(count(), expected_count()); return m_expected_count; }
inline bool complete() const { return count() >= expected_count(); }