Welcome to Subscribe On Youtube

Formatted question description: https://leetcode.ca/all/2299.html

2299. Strong Password Checker II

  • Difficulty: Easy.
  • Related Topics: String.
  • Similar Questions: Strong Password Checker, Validate IP Address.

Problem

A password is said to be strong if it satisfies all the following criteria:

  • It has at least 8 characters.

  • It contains at least one lowercase letter.

  • It contains at least one uppercase letter.

  • It contains at least one digit.

  • It contains at least one special character. The special characters are the characters in the following string: "!@#$%^&*()-+".

  • It does not contain 2 of the same character in adjacent positions (i.e., "aab" violates this condition, but "aba" does not).

Given a string password, return true** if it is a strong password**. Otherwise, return false.

  Example 1:

Input: password = "IloveLe3tcode!"
Output: true
Explanation: The password meets all the requirements. Therefore, we return true.

Example 2:

Input: password = "Me+You--IsMyDream"
Output: false
Explanation: The password does not contain a digit and also contains 2 of the same character in adjacent positions. Therefore, we return false.

Example 3:

Input: password = "1aB!"
Output: false
Explanation: The password does not meet the length requirement. Therefore, we return false.

  Constraints:

  • 1 <= password.length <= 100

  • password consists of letters, digits, and special characters: "!@#$%^&*()-+".

Solution (Java, C++, Python)

  • class Solution {
        public boolean strongPasswordCheckerII(String password) {
            if (password.length() < 8) {
                return false;
            }
            boolean l = false;
            boolean u = false;
            boolean d = false;
            boolean s = false;
            String special = "!@#$%^&*()-+";
            char previous = '.';
            for (int i = 0; i != password.length(); i++) {
                char ch = password.charAt(i);
                if (ch == previous) {
                    return false;
                }
                previous = ch;
                if (ch >= 'A' && ch <= 'Z') {
                    u = true;
                } else if (ch >= 'a' && ch <= 'z') {
                    l = true;
                } else if (ch >= '0' && ch <= '9') {
                    d = true;
                } else if (special.indexOf(ch) != -1) {
                    s = true;
                }
            }
            return l && u && d && s;
        }
    }
    
    ############
    
    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:
        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
    
    ############
    
    # 2299. Strong Password Checker II
    # https://leetcode.com/problems/strong-password-checker-ii/
    
    class Solution:
        def strongPasswordCheckerII(self, password: str) -> bool:
            n = len(password)
            if n < 8: return False
            
            lower = upper = numbers = special = 0
            
            for index, x in enumerate(password):
                if index + 1 < n and x == password[index + 1]:
                    return False
            
                if x in string.ascii_letters:
                    if x.islower():
                        lower += 1
                    else:
                        upper += 1
                elif x.isdigit():
                    numbers += 1
                else:
                    special += 1
    
            return lower > 0 and upper > 0 and numbers > 0 and special > 0
    
    
  • 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
        }
    }
    
    

Explain:

nope.

Complexity:

  • Time complexity : O(n).
  • Space complexity : O(n).

All Problems

All Solutions