1. 程式人生 > >Leetcode 76. 最小覆蓋子串

Leetcode 76. 最小覆蓋子串

ring false bst == span || pub 字符 cto

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; } };

Leetcode 76. 最小覆蓋子串