返回介绍

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

发布于 2024-06-17 01:03:07 字数 6047 浏览 0 评论 0 收藏 0

2299. 强密码检验器 II

English Version

题目描述

如果一个密码满足以下所有条件,我们称它是一个  密码:

  • 它有至少 8 个字符。
  • 至少包含 一个小写英文 字母。
  • 至少包含 一个大写英文 字母。
  • 至少包含 一个数字 。
  • 至少包含 一个特殊字符 。特殊字符为:"!@#$%^&*()-+" 中的一个。
  •  包含 2 个连续相同的字符(比方说 "aab" 不符合该条件,但是 "aba" 符合该条件)。

给你一个字符串 password ,如果它是一个  密码,返回 true,否则返回 false 。

 

示例 1:

输入:password = "IloveLe3tcode!"
输出:true
解释:密码满足所有的要求,所以我们返回 true 。

示例 2:

输入:password = "Me+You--IsMyDream"
输出:false
解释:密码不包含数字,且包含 2 个连续相同的字符。所以我们返回 false 。

示例 3:

输入:password = "1aB!"
输出:false
解释:密码不符合长度要求。所以我们返回 false 。

 

提示:

  • 1 <= password.length <= 100
  • password 包含字母,数字和 "!@#$%^&*()-+" 这些特殊字符。

解法

方法一:模拟 + 位运算

根据题目描述,我们可以模拟检查密码是否满足题目要求的过程。

首先,我们检查密码的长度是否小于 $8$,如果是,则返回 false

接下来,我们用一个掩码 mask 来记录密码是否包含小写字母、大写字母、数字和特殊字符。我们遍历密码,每次遍历到一个字符,先判断它是否和前一个字符相同,如果是,则返回 false。然后,根据字符的类型更新掩码 mask。最后,我们检查掩码 mask 是否为 $15$,如果是,则返回 true,否则返回 false

时间复杂度 $O(n)$,空间复杂度 $O(1)$。其中 $n$ 为密码的长度。

class Solution:
  def strongPasswordCheckerII(self, password: str) -> bool:
    if len(password) < 8:
      return False
    mask = 0
    for i, c in enumerate(password):
      if i and c == password[i - 1]:
        return False
      if c.islower():
        mask |= 1
      elif c.isupper():
        mask |= 2
      elif c.isdigit():
        mask |= 4
      else:
        mask |= 8
    return mask == 15
class Solution {
  public boolean strongPasswordCheckerII(String password) {
    if (password.length() < 8) {
      return false;
    }
    int mask = 0;
    for (int i = 0; i < password.length(); ++i) {
      char c = password.charAt(i);
      if (i > 0 && c == password.charAt(i - 1)) {
        return false;
      }
      if (Character.isLowerCase(c)) {
        mask |= 1;
      } else if (Character.isUpperCase(c)) {
        mask |= 2;
      } else if (Character.isDigit(c)) {
        mask |= 4;
      } else {
        mask |= 8;
      }
    }
    return mask == 15;
  }
}
class Solution {
public:
  bool strongPasswordCheckerII(string password) {
    if (password.size() < 8) {
      return false;
    }
    int mask = 0;
    for (int i = 0; i < password.size(); ++i) {
      char c = password[i];
      if (i && c == password[i - 1]) {
        return false;
      }
      if (c >= 'a' && c <= 'z') {
        mask |= 1;
      } else if (c >= 'A' && c <= 'Z') {
        mask |= 2;
      } else if (c >= '0' && c <= '9') {
        mask |= 4;
      } else {
        mask |= 8;
      }
    }
    return mask == 15;
  }
};
func strongPasswordCheckerII(password string) bool {
  if len(password) < 8 {
    return false
  }
  mask := 0
  for i, c := range password {
    if i > 0 && byte(c) == password[i-1] {
      return false
    }
    if unicode.IsLower(c) {
      mask |= 1
    } else if unicode.IsUpper(c) {
      mask |= 2
    } else if unicode.IsDigit(c) {
      mask |= 4
    } else {
      mask |= 8
    }
  }
  return mask == 15
}
function strongPasswordCheckerII(password: string): boolean {
  if (password.length < 8) {
    return false;
  }
  let mask = 0;
  for (let i = 0; i < password.length; ++i) {
    const c = password[i];
    if (i && c == password[i - 1]) {
      return false;
    }
    if (c >= 'a' && c <= 'z') {
      mask |= 1;
    } else if (c >= 'A' && c <= 'Z') {
      mask |= 2;
    } else if (c >= '0' && c <= '9') {
      mask |= 4;
    } else {
      mask |= 8;
    }
  }
  return mask == 15;
}
impl Solution {
  pub fn strong_password_checker_ii(password: String) -> bool {
    let s = password.as_bytes();
    let n = password.len();
    if n < 8 {
      return false;
    }
    let mut mask = 0;
    let mut prev = b' ';
    for &c in s.iter() {
      if c == prev {
        return false;
      }
      mask |= if c.is_ascii_uppercase() {
        0b1000
      } else if c.is_ascii_lowercase() {
        0b100
      } else if c.is_ascii_digit() {
        0b10
      } else {
        0b1
      };
      prev = c;
    }
    mask == 0b1111
  }
}
bool strongPasswordCheckerII(char* password) {
  int n = strlen(password);
  if (n < 8) {
    return false;
  }
  int mask = 0;
  char prev = ' ';
  for (int i = 0; i < n; i++) {
    if (prev == password[i]) {
      return false;
    }
    if (islower(password[i])) {
      mask |= 0b1000;
    } else if (isupper(password[i])) {
      mask |= 0b100;
    } else if (isdigit(password[i])) {
      mask |= 0b10;
    } else {
      mask |= 0b1;
    }
    prev = password[i];
  }
  return mask == 0b1111;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文