-
Notifications
You must be signed in to change notification settings - Fork 5
/
双指针-滑动窗口.js
224 lines (196 loc) · 5.29 KB
/
双指针-滑动窗口.js
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
/**
* Q1:最小覆盖子串
*
* - 给一个字符串a,在里面找能覆盖字符串b的最短字符串
* - 比如:在ADOBECODEBANC里找ABC,返回BANC
*
*/
// const inWindow = (str = '', target = '') => {
// const need = target.split('').reduce((res, pre) => {
// res[pre] = res[pre] || 0;
// res[pre] += 1;
// return res;
// }, {});
// const windowed = {};
// let left = 0;
// let right = 0;
// let valid = 0;
// let needValid = Object.keys(need).length;
// let len = Number.MAX_SAFE_INTEGER;
// let start = 0;
// while (right <= str.length) {
// const rightLetter = str[right];
// right += 1;
// if (rightLetter in need) {
// windowed[rightLetter] = windowed[rightLetter] || 0;
// windowed[rightLetter] += 1;
// if (windowed[rightLetter] === need[rightLetter]) {
// valid += 1;
// }
// }
// while (valid === needValid) {
// const leftLetter = str[left];
// if (leftLetter in need) {
// windowed[leftLetter] = windowed[leftLetter] || 0;
// windowed[leftLetter] -= 1;
// if (windowed[leftLetter] < need[leftLetter]) {
// valid -= 1;
// if (right - left < len) {
// len = right - left;
// start = left;
// }
// }
// }
// left += 1;
// }
// }
// return len === Number.MAX_SAFE_INTEGER ? '' : str.substr(start, len);
// };
// // test
// console.log(inWindow('ADOBECODEBANC', 'ABC'));
// // BANC
/**
* Q2:字符串排列
*
* - 给两个字符串s1和s2,判断s1的排列之一是s2子串
*/
// const inWindow = (str = '', target = '') => {
// const need = str.split('').reduce((res, pre) => {
// res[pre] = res[pre] || 0;
// res[pre] += 1;
// return res;
// }, {});
// let windowed = {};
// let left = 0;
// let right = 0;
// let result = false;
// let needValid = Object.keys(need).length;
// let valid = 0;
// while (right < target.length) {
// const rightLetter = target[right];
// right += 1;
// if (rightLetter in need) {
// windowed[rightLetter] = windowed[rightLetter] || 0;
// windowed[rightLetter] += 1;
// if (windowed[rightLetter] === need[rightLetter]) {
// valid += 1;
// }
// } else {
// if (valid) {
// valid = 0;
// windowed = {};
// }
// continue;
// }
// if (valid === needValid) {
// return true;
// }
// }
// return result;
// };
// // test
// console.log(inWindow('ab', 'eidbaooo'));
// // true
// console.log(inWindow('ab', 'eidboaoooo'));
// // false
/**
* Q3:找出所有字母异位词
*
* - 给两个字符串s1和s2,返回s2包含s1的所有异位词索引
* - bca、bac、cab都是abc的异位词
*/
// const inWindow = (str = '', target = '') => {
// const need = str.split('').reduce((res, pre) => {
// res[pre] = res[pre] || 0;
// res[pre] += 1;
// return res;
// }, {});
// let windowed = {};
// let left = 0;
// let right = 0;
// let result = [];
// let needValid = Object.keys(need).length;
// let valid = 0;
// while (right < target.length) {
// const rightLetter = target[right];
// right += 1;
// if (rightLetter in need) {
// windowed[rightLetter] = windowed[rightLetter] || 0;
// windowed[rightLetter] += 1;
// if (windowed[rightLetter] === need[rightLetter]) {
// valid += 1;
// }
// }
// if (valid === needValid) {
// result.push(left);
// }
// if (right - left >= str.length) {
// const leftLetter = target[left];
// if (leftLetter in need) {
// windowed[leftLetter] = windowed[leftLetter] || 0;
// windowed[leftLetter] -= 1;
// if (windowed[leftLetter] < need[leftLetter]) {
// valid -= 1;
// }
// }
// left += 1;
// }
// }
// return result;
// };
// // test
// console.log(inWindow('abc', 'cbaebabacd'));
// // [0, 6]
/**
* Q4:最长无重复子串
*
* - 找出字符串中无重复字符的最长长度
*/
// const inWindow = (str = '') => {
// const windowed = {};
// let result = 0;
// let left = 0;
// let right = 0;
// while (right <= str.length) {
// const rightLetter = str[right];
// windowed[rightLetter] = windowed[rightLetter] || 0;
// windowed[rightLetter] += 1;
// while (windowed[rightLetter] > 1) {
// result = Math.max(result, right - left);
// const leftLetter = str[left];
// left += 1;
// windowed[leftLetter] = windowed[leftLetter] || 0;
// windowed[leftLetter] -= 1;
// }
// right += 1;
// }
// return result;
// };
// // test
// console.log(inWindow('abcabcbb'));
// // 3
// console.log(inWindow('bbbb'));
// // 1
/**
* Q5:最大子数组和
*
* - 输入一个整数数组 nums,请你找在其中找一个和最大的子数组,返回这个子数组的和
*/
// const maxSubArray = (nums = []) => {
// let result = Number.MIN_SAFE_INTEGER;
// let left = 0;
// let right = 0;
// let temp = 0;
// while (right < nums.length) {
// temp += nums[right];
// right += 1;
// result = Math.max(result, temp);
// while (temp < 0) {
// temp -= nums[left];
// left += 1;
// }
// }
// return result;
// };
// // test
// console.log(maxSubArray([-3,1,3,-1,2,-4,2])); // 5