Skip to content

Commit fa76593

Browse files
committed
feat: add solutions to lc problem: No.2299
No.2299.Strong Password Checker II
1 parent 15fba16 commit fa76593

File tree

8 files changed

+193
-146
lines changed

8 files changed

+193
-146
lines changed

solution/2200-2299/2293.Min Max Game/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@
6262

6363
根据题意,我们可以模拟整个过程,最后剩下的数字即为答案。在实现上,我们不需要额外创建数组,直接在原数组上进行操作即可。
6464

65-
时间复杂度 $O(\log n)$,空间复杂度 $O(1)$。其中 $n$ 为数组 `nums` 的长度。
65+
时间复杂度 $O(n)$,空间复杂度 $O(1)$。其中 $n$ 为数组 `nums` 的长度。
6666

6767
<!-- tabs:start -->
6868

solution/2200-2299/2299.Strong Password Checker II/README.md

Lines changed: 70 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,15 @@
5454

5555
<!-- 这里可写通用的实现逻辑 -->
5656

57-
**方法一:直接遍历判断**
57+
**方法一:模拟 + 位运算**
58+
59+
根据题目描述,我们可以模拟检查密码是否满足题目要求的过程。
60+
61+
首先,我们检查密码的长度是否小于 $8$,如果是,则返回 `false`
62+
63+
接下来,我们用一个掩码 `mask` 来记录密码是否包含小写字母、大写字母、数字和特殊字符。我们遍历密码,每次遍历到一个字符,先判断它是否和前一个字符相同,如果是,则返回 `false`。然后,根据字符的类型更新掩码 `mask`。最后,我们检查掩码 `mask` 是否为 $15$,如果是,则返回 `true`,否则返回 `false`
64+
65+
时间复杂度 $O(n)$,空间复杂度 $O(1)$。其中 $n$ 为密码的长度。
5866

5967
<!-- tabs:start -->
6068

@@ -67,19 +75,19 @@ class Solution:
6775
def strongPasswordCheckerII(self, password: str) -> bool:
6876
if len(password) < 8:
6977
return False
70-
ans = 0
78+
mask = 0
7179
for i, c in enumerate(password):
72-
if i and password[i - 1] == c:
80+
if i and c == password[i - 1]:
7381
return False
7482
if c.islower():
75-
ans |= 1
83+
mask |= 1
7684
elif c.isupper():
77-
ans |= 2
85+
mask |= 2
7886
elif c.isdigit():
79-
ans |= 4
87+
mask |= 4
8088
else:
81-
ans |= 8
82-
return ans == 15
89+
mask |= 8
90+
return mask == 15
8391
```
8492

8593
### **Java**
@@ -92,24 +100,23 @@ class Solution {
92100
if (password.length() < 8) {
93101
return false;
94102
}
95-
int ans = 0;
96-
char prev = '.';
97-
for (char c : password.toCharArray()) {
98-
if (prev == c) {
103+
int mask = 0;
104+
for (int i = 0; i < password.length(); ++i) {
105+
char c = password.charAt(i);
106+
if (i > 0 && c == password.charAt(i - 1)) {
99107
return false;
100108
}
101-
prev = c;
102109
if (Character.isLowerCase(c)) {
103-
ans |= 1;
110+
mask |= 1;
104111
} else if (Character.isUpperCase(c)) {
105-
ans |= 2;
112+
mask |= 2;
106113
} else if (Character.isDigit(c)) {
107-
ans |= 4;
114+
mask |= 4;
108115
} else {
109-
ans |= 8;
116+
mask |= 8;
110117
}
111118
}
112-
return ans == 15;
119+
return mask == 15;
113120
}
114121
}
115122
```
@@ -120,22 +127,26 @@ class Solution {
120127
class Solution {
121128
public:
122129
bool strongPasswordCheckerII(string password) {
123-
if (password.size() < 8) return false;
124-
int ans = 0;
125-
char prev = '.';
126-
for (char& c : password) {
127-
if (c == prev) return false;
128-
prev = c;
129-
if (c >= 'a' && c <= 'z')
130-
ans |= 1;
131-
else if (c >= 'A' && c <= 'Z')
132-
ans |= 2;
133-
else if (c >= '0' && c <= '9')
134-
ans |= 4;
135-
else
136-
ans |= 8;
130+
if (password.size() < 8) {
131+
return false;
132+
}
133+
int mask = 0;
134+
for (int i = 0; i < password.size(); ++i) {
135+
char c = password[i];
136+
if (i && c == password[i - 1]) {
137+
return false;
138+
}
139+
if (c >= 'a' && c <= 'z') {
140+
mask |= 1;
141+
} else if (c >= 'A' && c <= 'Z') {
142+
mask |= 2;
143+
} else if (c >= '0' && c <= '9') {
144+
mask |= 4;
145+
} else {
146+
mask |= 8;
147+
}
137148
}
138-
return ans == 15;
149+
return mask == 15;
139150
}
140151
};
141152
```
@@ -147,39 +158,49 @@ func strongPasswordCheckerII(password string) bool {
147158
if len(password) < 8 {
148159
return false
149160
}
150-
ans := 0
161+
mask := 0
151162
for i, c := range password {
152-
if i > 0 && password[i] == password[i-1] {
163+
if i > 0 && byte(c) == password[i-1] {
153164
return false
154165
}
155166
if unicode.IsLower(c) {
156-
ans |= 1
167+
mask |= 1
157168
} else if unicode.IsUpper(c) {
158-
ans |= 2
169+
mask |= 2
159170
} else if unicode.IsDigit(c) {
160-
ans |= 4
171+
mask |= 4
161172
} else {
162-
ans |= 8
173+
mask |= 8
163174
}
164175
}
165-
return ans == 15
176+
return mask == 15
166177
}
167178
```
168179

169180
### **TypeScript**
170181

171182
```ts
172183
function strongPasswordCheckerII(password: string): boolean {
173-
if (password.length < 8) return false;
174-
if (!/[a-z]+/g.test(password)) return false;
175-
if (!/[A-Z]+/g.test(password)) return false;
176-
if (!/[0-9]+/g.test(password)) return false;
177-
if (!/[\!\@\#\$\%\^\&\*\(\)\-\+]+/g.test(password)) return false;
178-
const n = password.length;
179-
for (let i = 1; i < n; i++) {
180-
if (password.charAt(i) == password.charAt(i - 1)) return false;
184+
if (password.length < 8) {
185+
return false;
186+
}
187+
let mask = 0;
188+
for (let i = 0; i < password.length; ++i) {
189+
const c = password[i];
190+
if (i && c == password[i - 1]) {
191+
return false;
192+
}
193+
if (c >= 'a' && c <= 'z') {
194+
mask |= 1;
195+
} else if (c >= 'A' && c <= 'Z') {
196+
mask |= 2;
197+
} else if (c >= '0' && c <= '9') {
198+
mask |= 4;
199+
} else {
200+
mask |= 8;
201+
}
181202
}
182-
return true;
203+
return mask == 15;
183204
}
184205
```
185206

solution/2200-2299/2299.Strong Password Checker II/README_EN.md

Lines changed: 61 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -60,19 +60,19 @@ class Solution:
6060
def strongPasswordCheckerII(self, password: str) -> bool:
6161
if len(password) < 8:
6262
return False
63-
ans = 0
63+
mask = 0
6464
for i, c in enumerate(password):
65-
if i and password[i - 1] == c:
65+
if i and c == password[i - 1]:
6666
return False
6767
if c.islower():
68-
ans |= 1
68+
mask |= 1
6969
elif c.isupper():
70-
ans |= 2
70+
mask |= 2
7171
elif c.isdigit():
72-
ans |= 4
72+
mask |= 4
7373
else:
74-
ans |= 8
75-
return ans == 15
74+
mask |= 8
75+
return mask == 15
7676
```
7777

7878
### **Java**
@@ -83,24 +83,23 @@ class Solution {
8383
if (password.length() < 8) {
8484
return false;
8585
}
86-
int ans = 0;
87-
char prev = '.';
88-
for (char c : password.toCharArray()) {
89-
if (prev == c) {
86+
int mask = 0;
87+
for (int i = 0; i < password.length(); ++i) {
88+
char c = password.charAt(i);
89+
if (i > 0 && c == password.charAt(i - 1)) {
9090
return false;
9191
}
92-
prev = c;
9392
if (Character.isLowerCase(c)) {
94-
ans |= 1;
93+
mask |= 1;
9594
} else if (Character.isUpperCase(c)) {
96-
ans |= 2;
95+
mask |= 2;
9796
} else if (Character.isDigit(c)) {
98-
ans |= 4;
97+
mask |= 4;
9998
} else {
100-
ans |= 8;
99+
mask |= 8;
101100
}
102101
}
103-
return ans == 15;
102+
return mask == 15;
104103
}
105104
}
106105
```
@@ -111,22 +110,26 @@ class Solution {
111110
class Solution {
112111
public:
113112
bool strongPasswordCheckerII(string password) {
114-
if (password.size() < 8) return false;
115-
int ans = 0;
116-
char prev = '.';
117-
for (char& c : password) {
118-
if (c == prev) return false;
119-
prev = c;
120-
if (c >= 'a' && c <= 'z')
121-
ans |= 1;
122-
else if (c >= 'A' && c <= 'Z')
123-
ans |= 2;
124-
else if (c >= '0' && c <= '9')
125-
ans |= 4;
126-
else
127-
ans |= 8;
113+
if (password.size() < 8) {
114+
return false;
115+
}
116+
int mask = 0;
117+
for (int i = 0; i < password.size(); ++i) {
118+
char c = password[i];
119+
if (i && c == password[i - 1]) {
120+
return false;
121+
}
122+
if (c >= 'a' && c <= 'z') {
123+
mask |= 1;
124+
} else if (c >= 'A' && c <= 'Z') {
125+
mask |= 2;
126+
} else if (c >= '0' && c <= '9') {
127+
mask |= 4;
128+
} else {
129+
mask |= 8;
130+
}
128131
}
129-
return ans == 15;
132+
return mask == 15;
130133
}
131134
};
132135
```
@@ -138,39 +141,49 @@ func strongPasswordCheckerII(password string) bool {
138141
if len(password) < 8 {
139142
return false
140143
}
141-
ans := 0
144+
mask := 0
142145
for i, c := range password {
143-
if i > 0 && password[i] == password[i-1] {
146+
if i > 0 && byte(c) == password[i-1] {
144147
return false
145148
}
146149
if unicode.IsLower(c) {
147-
ans |= 1
150+
mask |= 1
148151
} else if unicode.IsUpper(c) {
149-
ans |= 2
152+
mask |= 2
150153
} else if unicode.IsDigit(c) {
151-
ans |= 4
154+
mask |= 4
152155
} else {
153-
ans |= 8
156+
mask |= 8
154157
}
155158
}
156-
return ans == 15
159+
return mask == 15
157160
}
158161
```
159162

160163
### **TypeScript**
161164

162165
```ts
163166
function strongPasswordCheckerII(password: string): boolean {
164-
if (password.length < 8) return false;
165-
if (!/[a-z]+/g.test(password)) return false;
166-
if (!/[A-Z]+/g.test(password)) return false;
167-
if (!/[0-9]+/g.test(password)) return false;
168-
if (!/[\!\@\#\$\%\^\&\*\(\)\-\+]+/g.test(password)) return false;
169-
const n = password.length;
170-
for (let i = 1; i < n; i++) {
171-
if (password.charAt(i) == password.charAt(i - 1)) return false;
167+
if (password.length < 8) {
168+
return false;
169+
}
170+
let mask = 0;
171+
for (let i = 0; i < password.length; ++i) {
172+
const c = password[i];
173+
if (i && c == password[i - 1]) {
174+
return false;
175+
}
176+
if (c >= 'a' && c <= 'z') {
177+
mask |= 1;
178+
} else if (c >= 'A' && c <= 'Z') {
179+
mask |= 2;
180+
} else if (c >= '0' && c <= '9') {
181+
mask |= 4;
182+
} else {
183+
mask |= 8;
184+
}
172185
}
173-
return true;
186+
return mask == 15;
174187
}
175188
```
176189

0 commit comments

Comments
 (0)