强密码检验器 II

标签: 字符串

难度: Easy

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

  • 它有至少 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 包含字母,数字和 "!@#$%^&*()-+" 这些特殊字符。

Submission

运行时间: 25 ms

内存: 15.9 MB

class Solution:
    def strongPasswordCheckerII(self, password: str) -> bool:
        if(len(password) < 8):
            return False
        if(re.search(r'[a-z]', password) == None):
            return False 
        if(re.search(r'[A-Z]', password) == None):
            return False 
        if(re.search(r'[0-9]', password) == None):
            return False
        if(re.search(r'[!@#$%^&*()\-+]', password) == None):
            return False
        if(re.search(r'(.)\1+', password) != None):
            return False
        return True

Explain

此题解采用正则表达式来检查密码是否满足各项要求。首先检查密码长度是否大于等于8。接着依次检查密码中是否至少包含一个小写字母、一个大写字母、一个数字和一个特殊字符。最后检查密码中是否存在连续相同的字符。如果所有条件都满足,则返回True,否则返回False。

时间复杂度: O(n)

空间复杂度: O(1)

class Solution:
    def strongPasswordCheckerII(self, password: str) -> bool:
        if(len(password) < 8):  # 检查密码长度
            return False
        if(re.search(r'[a-z]', password) == None):  # 检查是否包含小写字母
            return False 
        if(re.search(r'[A-Z]', password) == None):  # 检查是否包含大写字母
            return False 
        if(re.search(r'[0-9]', password) == None):  # 检查是否包含数字
            return False
        if(re.search(r'[!@#$%^&*()\-+]', password) == None):  # 检查是否包含特殊字符
            return False
        if(re.search(r'(.)\1+', password) != None):  # 检查是否存在连续相同字符
            return False
        return True

Explore

正则表达式中的`(.)\1+`用于检查密码中是否存在连续相同的字符。其中,`(.)`表示匹配任意单个字符并将其捕获为一个组,`\1`是对前面捕获的组的引用,`+`表示前面的元素出现一次或多次。这种表达方式可以准确地检测所有连续相同字符的情况,因为它会匹配任何连续重复的字符,无论是字母、数字还是特殊字符。

选择正则表达式作为验证密码条件的主要方法是因为正则表达式提供了一种简洁且强大的方式来匹配模式,从而可以简化代码并减少编程错误。尽管正则表达式在某些情况下可能较慢,存在更高效的实现方式,例如,通过单次遍历字符串并使用简单的条件判断来检查所有必要的密码要求,这可能会比多次执行正则匹配更快,特别是对于较长的密码。

多次使用正则表达式匹配的优点在于代码的可读性和简洁性,因为正则表达式能够直观地描述所需匹配的模式。然而,这种方法的缺点是效率较低,因为每次执行正则表达式都需要重新扫描整个字符串,这在密码较长时尤其耗时。相比之下,单次遍历字符串在一次过程中检查所有条件,可以显著提高效率,尤其是对于复杂的密码验证规则。

在正则表达式`[!@#$%^&*()\-+]`中,连字符`-`被正确地放置在字符集的最后一位,这样做可以避免其被解释为范围操作符。如果`-`放置在两个字符之间,例如`a-c`, 它会被解释为从`a`到`c`的范围。因此,在这个正则表达式中,`-`作为字面量字符被正确处理。