0%

76. Minimum Window Substring

2018年4月19日 下午3:54
Minimum Window Substring - LeetCode

  1. 表面上我们遍历的的是string::s中的一个个元素,其实这一个个元素代表着“以这个元素结尾的一个【满足题目要求】的一个子串”。——76
    1. 这时我们就可以说:我们遍历的“元素”,变成了一个个的[满足要求]的子串
  2. 这里的数据结构很巧妙:
    1. 怎样能看出巧妙?某一个操作能用当前选择的数据结构直接实现,而不用在写循环呀、判断呀啥的。
    2. 我们这里的两个int[128] map,就是可map_s[begin_ch] > map_t[begin_ch]直接比较
    3. 并且还可以结合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
//这个是老师的代码,我就不提交了

//这道题双指针遍历s,并且i是稳定+1的,而另个指针window_begin的变化是不确定的。
//也只有这样才可以用来求不确定位置和长度的最小窗口。
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;
//给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++){
//给s做统计,统计每个字符出现的次数
map_s[s[i]]++;

//找到window_begin的位置,判断从window_begin ~ i 之间的是否满足了t的要求
while(window_begin < i){
//取出当前s中我们正在操作的字符
char begin_ch = s[window_begin];
if (map_t[begin_ch] == 0){//当前字符不在t中
window_begin++;
}
else if (map_s[begin_ch] > map_t[begin_ch]){//当前,s中统计的个数要比t中个数多
map_s[begin_ch]--;
window_begin++;
}
else{//其他情况,window_begin维持不动,等待i的扩大,添加新元素之后进行再次的判断。
break;
}
}
//判断从window_begin ~ i 之间的是否满足了t的要求
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);
}
}
}
//我专门提交错误
// return result;
}
};