2018年4月19日 下午3:54
Minimum Window Substring - LeetCode
- 表面上我们遍历的的是string::s中的一个个元素,其实这一个个元素代表着“以这个元素结尾的一个【满足题目要求】的一个子串”。——76
- 这时我们就可以说:我们遍历的“元素”,变成了一个个的[满足要求]的子串
- 这里的数据结构很巧妙:
- 怎样能看出巧妙?某一个操作能用当前选择的数据结构直接实现,而不用在写循环呀、判断呀啥的。
- 我们这里的两个int[128] map,就是可
map_s[begin_ch] > map_t[begin_ch]直接比较
- 并且还可以结合vector作为int[128]map的下标。
map_s[vec_t[i]] < map_t[vec_t[i]]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
|
class Solution { private: bool is_window_ok(int map_s[], int map_t[], std::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; } public: std::string minWindow(std::string s, std::string t) { const int MAX_ARRAY_LEN = 128; int map_t[MAX_ARRAY_LEN] = {0}; int map_s[MAX_ARRAY_LEN] = {0}; std::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; std::string result;
for (int i = 0; i < s.length(); i++){ map_s[s[i]]++; while(window_begin < i){ char begin_ch = s[window_begin]; if (map_t[begin_ch] == 0){ window_begin++; } else if (map_s[begin_ch] > map_t[begin_ch]){ map_s[begin_ch]--; window_begin++; } else{ break; } } if (is_window_ok(map_s, map_t, vec_t)){ int new_window_len = i - window_begin + 1; if (result == "" || result.length() > new_window_len){ result = s.substr(window_begin, new_window_len); } } } } };
|