1
class Solution {
2
public:
3
int strongPasswordChecker(string password) {
4
if (password.size() <= 2)
5
return (6 - password.size());
6
else {
7
// is first condition met?
8
int sizeissue = 0;
9
if (password.size() < 6)
10
sizeissue = password.size() - 6;
11
else if (password.size() > 20)
12
sizeissue = password.size() - 20;
13

14
// is second condition met?
15
int chtype = 0, u = 1, l = 1, d = 1;
16

17
if (none_of(password.begin(), password.end(), &::isupper)) {
18
chtype++;
19
u = 0;
20
}
21
if (none_of(password.begin(), password.end(), &::islower)) {
22
chtype++;
23
l = 0;
24
}
25
if (none_of(password.begin(), password.end(), &::isdigit)) {
26
chtype++;
27
d = 0;
28
}
29

30
// is the third condition met? Note there are 26 letter, the string is
31
// constrained under 50, so realistically you can always find some 'other'
32
// character not included previously in the string to break the password
33
// apart so the consecutive characters are split apart. So need to find
34
// the largest sets of consecutive characters or 'blocks', and for these
35
// the min is (size of block (-1 if even)/2?
36
unsigned int output = 0, i = 0, start, end, issuethree = 0;
37
char c;
38

39
if (sizeissue < 0) {
40
while (i < (password.size() - 2)) {
41
if (password[i] == password[i + 1] && password[i] == password[i + 2]) {
42
start = i;
43
c = password[i];
44
i++;
45
while (c == password[i + 2] && i < (password.size() - 2)) i++;
46
end = i + 1;
47
i = end + 1;
48

49
// what would the amount of changes be needed?
50

51
issuethree = (end - start + 1) / 3;
52

53
// add the latest issue to total output
54
output = output + issuethree;
55

56
// check if the missing second condition issue could resolve any of
57
// this
58
if (chtype >= 1) {
59
if (islower(c) && (u == 0)) {
60
chtype--;
61
u = 1;
62
issuethree--;
63
if (sizeissue < 0) sizeissue++;
64
}
65
if (islower(c) && (d == 0) && issuethree > 0) {
66
chtype--;
67
d = 1;
68
issuethree--;
69
if (sizeissue < 0) sizeissue++;
70
}
71

72
if (isupper(c) && (l == 0)) {
73
chtype--;
74
l = 1;
75
issuethree--;
76
if (sizeissue < 0) sizeissue++;
77
}
78
if (isupper(c) && (d == 0) && issuethree > 0) {
79
chtype--;
80
d = 1;
81
issuethree--;
82
if (sizeissue < 0) sizeissue++;
83
}
84

85
if (isxdigit(c) && (l == 0)) {
86
chtype--;
87
l = 1;
88
issuethree--;
89
}
90
if (isxdigit(c) && (u == 0) && issuethree > 0) {
91
chtype--;
92
u = 1;
93
issuethree--;
94
if (sizeissue < 0) sizeissue++;
95
}
96

97
if (c == '!' && (u == 0)) {
98
chtype--;
99
u = 1;
100
issuethree--;
101
if (sizeissue < 0) sizeissue++;
102
}
103
if (c == '!' && (d == 0) && issuethree > 0) {
104
chtype--;
105
d = 1;
106
issuethree--;
107
if (sizeissue < 0) sizeissue++;
108
}
109
if (c == '!' && (l == 0) && issuethree > 0) {
110
chtype--;
111
l = 1;
112
issuethree--;
113
if (sizeissue < 0) sizeissue++;
114
}
115

116
if (c == '.' && (u == 0)) {
117
chtype--;
118
u = 1;
119
issuethree--;
120
if (sizeissue < 0) sizeissue++;
121
}
122
if (c == '.' && (d == 0) && issuethree > 0) {
123
chtype--;
124
d = 1;
125
issuethree--;
126
if (sizeissue < 0) sizeissue++;
127
}
128
if (c == '.' && (l == 0) && issuethree > 0) {
129
chtype--;
130
l = 1;
131
issuethree--;
132
if (sizeissue < 0) sizeissue++;
133
}
134
}
135

136
// check first issue would resolve this
137
if ((-sizeissue) <= issuethree)
138
sizeissue = 0; // e.g. aaa
139
else
140
sizeissue = sizeissue + issuethree; // don't think this option is possible?
141

142
} else
143
i++;
144
}
145
if (chtype > 0 && sizeissue < 0) {
146
if (chtype > abs(sizeissue))
147
sizeissue = 0;
148
else
149
sizeissue = sizeissue + chtype;
150
}
151
}
152

153
else if (sizeissue == 0) {
154
while (i < (password.size() - 2)) {
155
if (password[i] == password[i + 1] && password[i] == password[i + 2]) {
156
start = i;
157
c = password[i];
158
i++;
159
while (c == password[i + 2] && i < (password.size() - 2)) i++;
160
end = i + 1;
161
i = end + 1;
162

163
// what would the amount of changes be needed?
164

165
issuethree = (end - start + 1) / 3;
166

167
// add the latest issue to total output
168
output = output + issuethree;
169

170
// check if the missing second condition issue could resolve any of
171
// this
172
if (chtype >= 1) {
173
if (islower(c) && (u == 0)) {
174
chtype--;
175
u = 1;
176
issuethree--;
177
if (sizeissue < 0) sizeissue++;
178
}
179
if (islower(c) && (d == 0) && issuethree > 0) {
180
chtype--;
181
d = 1;
182
issuethree--;
183
if (sizeissue < 0) sizeissue++;
184
}
185

186
if (isupper(c) && (l == 0)) {
187
chtype--;
188
l = 1;
189
issuethree--;
190
if (sizeissue < 0) sizeissue++;
191
}
192
if (isupper(c) && (d == 0) && issuethree > 0) {
193
chtype--;
194
d = 1;
195
issuethree--;
196
if (sizeissue < 0) sizeissue++;
197
}
198

199
if (isxdigit(c) && (l == 0)) {
200
chtype--;
201
l = 1;
202
issuethree--;
203
}
204
if (isxdigit(c) && (u == 0) && issuethree > 0) {
205
chtype--;
206
u = 1;
207
issuethree--;
208
if (sizeissue < 0) sizeissue++;
209
}
210

211
if (c == '!' && (u == 0)) {
212
chtype--;
213
u = 1;
214
issuethree--;
215
if (sizeissue < 0) sizeissue++;
216
}
217
if (c == '!' && (d == 0) && issuethree > 0) {
218
chtype--;
219
d = 1;
220
issuethree--;
221
if (sizeissue < 0) sizeissue++;
222
}
223
if (c == '!' && (l == 0) && issuethree > 0) {
224
chtype--;
225
l = 1;
226
issuethree--;
227
if (sizeissue < 0) sizeissue++;
228
}
229

230
if (c == '.' && (u == 0)) {
231
chtype--;
232
u = 1;
233
issuethree--;
234
if (sizeissue < 0) sizeissue++;
235
}
236
if (c == '.' && (d == 0) && issuethree > 0) {
237
chtype--;
238
d = 1;
239
issuethree--;
240
if (sizeissue < 0) sizeissue++;
241
}
242
if (c == '.' && (l == 0) && issuethree > 0) {
243
chtype--;
244
l = 1;
245
issuethree--;
246
if (sizeissue < 0) sizeissue++;
247
}
248
}
249

250
} else
251
i++;
252
}
253
}
254

255
else if (sizeissue > 0) {
256
int v[3], mod;
257
v[0] = 0;
258
v[1] = 0;
259
v[2] = 0;
260
// have a vector where it says how many extra characters at the end of a
261
// block; e.g. aaa aa = v[2]=1; and in issue three how many blocks;
262
while (i < (password.size() - 2)) {
263
if (password[i] == password[i + 1] && password[i] == password[i + 2]) {
264
start = i;
265
c = password[i];
266
i++;
267
while (c == password[i + 2] && i < (password.size() - 2)) i++;
268
end = i + 1;
269
i = end + 1;
270

271
issuethree = issuethree + (end - start + 1) / 3;
272
mod = (end - start + 1) % 3;
273
v[mod] = v[mod] + 1;
274
}
275

276
else
277
i++;
278
}
279
output = issuethree;
280

281
// delete efficiently to ensure most 'blocks of 3' are removed.
282
while (sizeissue >= 1 && v[0] > 0) {
283
sizeissue = sizeissue - 1;
284
v[0]--;
285
issuethree--;
286
}
287
while (sizeissue >= 2 && v[1] > 0) {
288
sizeissue = sizeissue - 2;
289
v[1]--;
290
output = output + 1;
291
issuethree--;
292
}
293
while (sizeissue >= 3 && v[2] > 0) {
294
sizeissue = sizeissue - 3;
295
v[2]--;
296
output = output + 2;
297
issuethree--;
298
}
299
while (sizeissue >= 3 && issuethree > 0) {
300
sizeissue = sizeissue - 3;
301
issuethree--;
302
output = output + 2;
303
}
304

305
i = 0;
306
// check if the missing second condition issue could resolve any of this
307
{
308
while (i < (password.size() - 2) && issuethree > 0) {
309
if (password[i] == password[i + 1] && password[i] == password[i + 2]) {
310
start = i;
311
c = password[i];
312
i++;
313
while (c == password[i + 2] && i < (password.size() - 2)) i++;
314
end = i + 1;
315
i = end + 1;
316

317
// check if the missing second condition issue could resolve any
318
// of this
319
if (chtype >= 1) {
320
if (islower(c) && (u == 0)) {
321
chtype--;
322
u = 1;
323
issuethree--;
324
if (sizeissue < 0) sizeissue++;
325
}
326
if (islower(c) && (d == 0) && issuethree > 0) {
327
chtype--;
328
d = 1;
329
issuethree--;
330
if (sizeissue < 0) sizeissue++;
331
}
332

333
if (isupper(c) && (l == 0)) {
334
chtype--;
335
l = 1;
336
issuethree--;
337
if (sizeissue < 0) sizeissue++;
338
}
339
if (isupper(c) && (d == 0) && issuethree > 0) {
340
chtype--;
341
d = 1;
342
issuethree--;
343
if (sizeissue < 0) sizeissue++;
344
}
345

346
if (isxdigit(c) && (l == 0)) {
347
chtype--;
348
l = 1;
349
issuethree--;
350
}
351
if (isxdigit(c) && (u == 0) && issuethree > 0) {
352
chtype--;
353
u = 1;
354
issuethree--;
355
if (sizeissue < 0) sizeissue++;
356
}
357

358
if (c == '!' && (u == 0)) {
359
chtype--;
360
u = 1;
361
issuethree--;
362
if (sizeissue < 0) sizeissue++;
363
}
364
if (c == '!' && (d == 0) && issuethree > 0) {
365
chtype--;
366
d = 1;
367
issuethree--;
368
if (sizeissue < 0) sizeissue++;
369
}
370
if (c == '!' && (l == 0) && issuethree > 0) {
371
chtype--;
372
l = 1;
373
issuethree--;
374
if (sizeissue < 0) sizeissue++;
375
}
376

377
if (c == '.' && (u == 0)) {
378
chtype--;
379
u = 1;
380
issuethree--;
381
if (sizeissue < 0) sizeissue++;
382
}
383
if (c == '.' && (d == 0) && issuethree > 0) {
384
chtype--;
385
d = 1;
386
issuethree--;
387
if (sizeissue < 0) sizeissue++;
388
}
389
if (c == '.' && (l == 0) && issuethree > 0) {
390
chtype--;
391
l = 1;
392
issuethree--;
393
if (sizeissue < 0) sizeissue++;
394
}
395
}
396

397
} else
398
i++;
399
}
400
}
401
}
402

403
// add all other changes remaining to be done
404
output = output + chtype + abs(sizeissue);
405

406
return output;
407
}
408
}
409
};

0

WPM •0 •0

100%

ACC •0 •0

0s

TIME •0