题目描述
模拟
仅当密码包含强密码的所有特性,它是一个 强 密码。提示我们,遍历密码,维护 4 4 4 个标志,标志记录特性。遍历结束,根据标志判断特性。
class Solution {
public:
bool strongPasswordCheckerII(string password) {
int n = password.size();
bool lower = false, upper = false, digit = false, sp = false;
if (n < 8) return false;
for(int i = 0; i < n; i ++) {
if (i && password[i] == password[i - 1]) return false;
if (islower(password[i])) lower = true;
else if (isupper(password[i])) upper = true;
else if (isdigit(password[i])) digit = true;
else sp = true;
}
return lower && upper && digit && sp;
}
};
class Solution:
def strongPasswordCheckerII(self, password: str) -> bool:
if len(password) < 8: return False
lower, upper, digit, sp = False, False, False, False
for i, c in enumerate(password):
if i and c == password[i - 1]: return False
if c.islower(): lower = True
elif c.isupper(): upper = True
elif c.isdigit(): digit = True
else: sp = True;
return lower and upper and digit and sp
- 时间复杂度 : O ( n ) O(n) O(n) , n n n 是密码长度 ,遍历的时间复杂度 O ( n ) O(n) O(n) 。
- 空间复杂度 : O ( 1 ) O(1) O(1) , 只使用常量级空间 。
位运算
用位运算表示标志。将标志看成二进制串,某一位是0
,表示特性不存在;某一位是1
,表示特性存在。一共4
个特性,
2
0
/
2
1
/
2
2
/
2
3
2^0/2^1/2^2/2^3
20/21/22/23 。
提示 : 标志是一个 4 4 4 位二进制数。
class Solution {
public:
bool strongPasswordCheckerII(string password) {
int n = password.size();
if (n < 8) return false;
int ans = 0;
for(int i = 0; i < n; i ++) {
if (i && password[i] == password[i - 1]) return false;
if (islower(password[i])) ans |= 1;
else if (isupper(password[i])) ans |= 2;
else if (isdigit(password[i])) ans |= 4;
else ans |= 8;
}
return 15 == ans;
}
};
class Solution:
def strongPasswordCheckerII(self, password: str) -> bool:
if len(password) < 8: return False
ans = 0
for i, c in enumerate(password):
if i and c == password[i - 1]: return False
if c.islower(): ans |= 1
elif c.isupper(): ans |= 2
elif c.isdigit(): ans |= 4
else: ans |= 8
return ans == 15
- 时间复杂度 : O ( n ) O(n) O(n) , n n n 是密码长度 ,遍历的时间复杂度 O ( n ) O(n) O(n) 。
- 空间复杂度 : O ( 1 ) O(1) O(1) , 只使用常量级空间 。
AC
致语
- 理解思路很重要
- 读者有问题请留言,清墨看到就会回复的。