Off-by-one on range boundaries
Wrong move: Loop endpoints miss first/last candidate.
Usually fails on: Fails on minimal arrays and exact-boundary answers.
Fix: Re-derive loops from inclusive/exclusive ranges before coding.
Build confidence with an intuition-first walkthrough focused on core interview patterns fundamentals.
A password is said to be strong if it satisfies all the following criteria:
8 characters."!@#$%^&*()-+".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 <= 100password consists of letters, digits, and special characters: "!@#$%^&*()-+".Problem summary: 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.
Start with the most direct exhaustive search. That gives a correctness anchor before optimizing.
Pattern signal: General problem-solving
"IloveLe3tcode!"
"Me+You--IsMyDream"
"1aB!"
strong-password-checker)validate-ip-address)Source-backed implementations are provided below for direct study and interview prep.
// Accepted solution for LeetCode #2299: Strong Password Checker II
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;
}
}
// Accepted solution for LeetCode #2299: Strong Password Checker II
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
}
# Accepted solution for LeetCode #2299: Strong Password Checker II
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
// Accepted solution for LeetCode #2299: Strong Password Checker II
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
}
}
// Accepted solution for LeetCode #2299: Strong Password Checker II
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;
}
Use this to step through a reusable interview workflow for this problem.
Two nested loops check every pair or subarray. The outer loop fixes a starting point, the inner loop extends or searches. For n elements this gives up to n²/2 operations. No extra space, but the quadratic time is prohibitive for large inputs.
Most array problems have an O(n²) brute force (nested loops) and an O(n) optimal (single pass with clever state tracking). The key is identifying what information to maintain as you scan: a running max, a prefix sum, a hash map of seen values, or two pointers.
Review these before coding to avoid predictable interview regressions.
Wrong move: Loop endpoints miss first/last candidate.
Usually fails on: Fails on minimal arrays and exact-boundary answers.
Fix: Re-derive loops from inclusive/exclusive ranges before coding.