力扣(LeetCode)2299. 强密码检验器 II(C++/Python3)

题目描述

力扣(LeetCode)2299. 强密码检验器 II(C++/Python3)_第1张图片

模拟

仅当密码包含强密码的所有特性,它是一个 密码。提示我们,遍历密码,维护 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
  1. 时间复杂度 : O ( n ) O(n) O(n) n n n 是密码长度 ,遍历的时间复杂度 O ( n ) O(n) O(n)
  2. 空间复杂度 : 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
  1. 时间复杂度 : O ( n ) O(n) O(n) n n n 是密码长度 ,遍历的时间复杂度 O ( n ) O(n) O(n)
  2. 空间复杂度 : O ( 1 ) O(1) O(1) , 只使用常量级空间 。

AC

力扣(LeetCode)2299. 强密码检验器 II(C++/Python3)_第2张图片

致语

  • 理解思路很重要
  • 读者有问题请留言,清墨看到就会回复的。

你可能感兴趣的:(墨染leetcode,leetcode,c++,算法)