420. Strong Password Checker LeetCode Solution
In this guide, you will get 420. Strong Password Checker LeetCode Solution with the best time and space complexity. The solution to Strong Password Checker problem is provided in various programming languages like C++, Java, and Python. This will be helpful for you if you are preparing for placements, hackathons, interviews, or practice purposes. The solutions provided here are very easy to follow and include detailed explanations.
Table of Contents
- Problem Statement
- Complexity Analysis
- Strong Password Checker solution in C++
- Strong Password Checker solution in Java
- Strong Password Checker solution in Python
- Additional Resources
Problem Statement of Strong Password Checker
A password is considered strong if the below conditions are all met:
It has at least 6 characters and at most 20 characters.
It contains at least one lowercase letter, at least one uppercase letter, and at least one digit.
It does not contain three repeating characters in a row (i.e., “Baaabb0” is weak, but “Baaba0” is strong).
Given a string password, return the minimum number of steps required to make password strong. if password is already strong, return 0.
In one step, you can:
Insert one character to password,
Delete one character from password, or
Replace one character of password with another character.
Example 1:
Input: password = “a”
Output: 5
Example 2:
Input: password = “aA1”
Output: 3
Example 3:
Input: password = “1337C0d3”
Output: 0
Constraints:
1 <= password.length <= 50
password consists of letters, digits, dot '.' or exclamation mark '!'.
Complexity Analysis
- Time Complexity: O(n)
- Space Complexity: O(1)
420. Strong Password Checker LeetCode Solution in C++
class Solution {
public:
int strongPasswordChecker(string password) {
const int n = password.length();
const int missing = getMissing(password);
// the number of replacements to deal with 3 repeating characters
int replaces = 0;
// the number of sequences that can be substituted with 1 deletions,
// (3k)-seqs
int oneSeq = 0;
// the number of sequences that can be substituted with 2 deletions,
// (3k + 1)-seqs
int twoSeq = 0;
for (int i = 2; i < n;)
if (password[i] == password[i - 1] &&
password[i - 1] == password[i - 2]) {
int length = 2; // the length of the repeating password
while (i < n && password[i] == password[i - 1]) {
++length;
++i;
}
replaces += length / 3; // 'aaaaaaa' -> 'aaxaaxa'
if (length % 3 == 0)
++oneSeq;
if (length % 3 == 1)
++twoSeq;
} else {
++i;
}
if (n < 6)
return max(6 - n, missing);
if (n <= 20)
return max(replaces, missing);
const int deletes = n - 20;
// Each replacement in (3k)-seqs can be substituted with 1 deletions.
replaces -= min(oneSeq, deletes);
// Each replacement in (3k + 1)-seqs can be substituted with 2 deletions.
replaces -= min(max(deletes - oneSeq, 0), twoSeq * 2) / 2;
// Each replacement in other seqs can be substituted with 3 deletions.
replaces -= max(deletes - oneSeq - twoSeq * 2, 0) / 3;
return deletes + max(replaces, missing);
}
private:
int getMissing(const string& password) {
return 3 - //
ranges::any_of(password, [](char c) { return isupper(c); }) -
ranges::any_of(password, [](char c) { return islower(c); }) -
ranges::any_of(password, [](char c) { return isdigit(c); });
}
};
/* code provided by PROGIEZ */
420. Strong Password Checker LeetCode Solution in Java
class Solution {
public int strongPasswordChecker(String password) {
final int n = password.length();
final int missing = getMissing(password);
// the number of replacements to deal with 3 repeating characters
int replaces = 0;
// the number of sequences that can be substituted with 1 deletions, (3k)-seqs
int oneSeq = 0;
// the number of sequences that can be substituted with 2 deletions, (3k + 1)-seqs
int twoSeq = 0;
for (int i = 2; i < n;)
if (password.charAt(i) == password.charAt(i - 1) &&
password.charAt(i - 1) == password.charAt(i - 2)) {
int length = 2; // the length of the repeating password
while (i < n && password.charAt(i) == password.charAt(i - 1)) {
++length;
++i;
}
replaces += length / 3; // 'aaaaaaa' -> 'aaxaaxa'
if (length % 3 == 0)
++oneSeq;
if (length % 3 == 1)
++twoSeq;
} else {
++i;
}
if (n < 6)
return Math.max(6 - n, missing);
if (n <= 20)
return Math.max(replaces, missing);
final int deletes = n - 20;
// Each replacement in (3k)-seqs can be substituted with 1 deletions.
replaces -= Math.min(oneSeq, deletes);
// Each replacement in (3k + 1)-seqs can be substituted with 2 deletions.
replaces -= Math.min(Math.max(deletes - oneSeq, 0), twoSeq * 2) / 2;
// Each replacement in other seqs can be substituted with 3 deletions.
replaces -= Math.max(deletes - oneSeq - twoSeq * 2, 0) / 3;
return deletes + Math.max(replaces, missing);
}
private int getMissing(final String password) {
return 3 - //
(password.chars().anyMatch(Character::isUpperCase) ? 1 : 0) -
(password.chars().anyMatch(Character::isLowerCase) ? 1 : 0) -
(password.chars().anyMatch(Character::isDigit) ? 1 : 0);
}
}
// code provided by PROGIEZ
420. Strong Password Checker LeetCode Solution in Python
class Solution:
def strongPasswordChecker(self, password: str) -> int:
n = len(password)
missing = self._getMissing(password)
# the number of replacements to deal with 3 repeating characters
replaces = 0
# the number of sequences that can be substituted with 1 deletions,
# (3k)-seqs
oneSeq = 0
# the number of sequences that can be substituted with 2 deletions,
# (3k + 1)-seqs
twoSeq = 0
i = 2
while i < n:
if password[i] == password[i - 1] and password[i - 1] == password[i - 2]:
length = 2 # the length of the repeating password
while i < n and password[i] == password[i - 1]:
length += 1
i += 1
replaces += length // 3 # 'aaaaaaa' -> 'aaxaaxa'
if length % 3 == 0:
oneSeq += 1
if length % 3 == 1:
twoSeq += 1
else:
i += 1
if n < 6:
return max(6 - n, missing)
if n <= 20:
return max(replaces, missing)
deletes = n - 20
# Each replacement in (3k)-seqs can be substituted with 1 deletions.
replaces -= min(oneSeq, deletes)
# Each replacement in (3k + 1)-seqs can be substituted with 2 deletions.
replaces -= min(max(deletes - oneSeq, 0), twoSeq * 2) // 2
# Each replacement in other seqs can be substituted with 3 deletions.
replaces -= max(deletes - oneSeq - twoSeq * 2, 0) // 3
return deletes + max(replaces, missing)
def _getMissing(self, password: str) -> int:
return (3
- any(c.isupper() for c in password)
- any(c.islower() for c in password)
- any(c.isdigit() for c in password))
# code by PROGIEZ
Additional Resources
- Explore all LeetCode problem solutions at Progiez here
- Explore all problems on LeetCode website here
Happy Coding! Keep following PROGIEZ for more updates and solutions.