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.
You are given a string s of even length. Split this string into two halves of equal lengths, and let a be the first half and b be the second half.
Two strings are alike if they have the same number of vowels ('a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U'). Notice that s contains uppercase and lowercase letters.
Return true if a and b are alike. Otherwise, return false.
Example 1:
Input: s = "book" Output: true Explanation: a = "bo" and b = "ok". a has 1 vowel and b has 1 vowel. Therefore, they are alike.
Example 2:
Input: s = "textbook" Output: false Explanation: a = "text" and b = "book". a has 1 vowel whereas b has 2. Therefore, they are not alike. Notice that the vowel o is counted twice.
Constraints:
2 <= s.length <= 1000s.length is even.s consists of uppercase and lowercase letters.Problem summary: You are given a string s of even length. Split this string into two halves of equal lengths, and let a be the first half and b be the second half. Two strings are alike if they have the same number of vowels ('a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U'). Notice that s contains uppercase and lowercase letters. Return true if a and b are alike. Otherwise, return false.
Start with the most direct exhaustive search. That gives a correctness anchor before optimizing.
Pattern signal: General problem-solving
"book"
"textbook"
Source-backed implementations are provided below for direct study and interview prep.
// Accepted solution for LeetCode #1704: Determine if String Halves Are Alike
class Solution {
public boolean halvesAreAlike(String s) {
Set<Character> vowels = Set.of('a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U');
int n = s.length() >> 1;
int cnt = 0;
for (int i = 0; i < n; ++i) {
cnt += vowels.contains(s.charAt(i)) ? 1 : 0;
cnt -= vowels.contains(s.charAt(i + n)) ? 1 : 0;
}
return cnt == 0;
}
}
// Accepted solution for LeetCode #1704: Determine if String Halves Are Alike
func halvesAreAlike(s string) bool {
vowels := map[byte]bool{}
for _, c := range "aeiouAEIOU" {
vowels[byte(c)] = true
}
cnt, n := 0, len(s)>>1
for i := 0; i < n; i++ {
if vowels[s[i]] {
cnt++
}
if vowels[s[i+n]] {
cnt--
}
}
return cnt == 0
}
# Accepted solution for LeetCode #1704: Determine if String Halves Are Alike
class Solution:
def halvesAreAlike(self, s: str) -> bool:
cnt, n = 0, len(s) >> 1
vowels = set('aeiouAEIOU')
for i in range(n):
cnt += s[i] in vowels
cnt -= s[i + n] in vowels
return cnt == 0
// Accepted solution for LeetCode #1704: Determine if String Halves Are Alike
impl Solution {
pub fn halves_are_alike(s: String) -> bool {
let n = s.len() / 2;
let vowels: std::collections::HashSet<char> = "aeiouAEIOU".chars().collect();
let mut cnt = 0;
for i in 0..n {
if vowels.contains(&s.chars().nth(i).unwrap()) {
cnt += 1;
}
if vowels.contains(&s.chars().nth(i + n).unwrap()) {
cnt -= 1;
}
}
cnt == 0
}
}
// Accepted solution for LeetCode #1704: Determine if String Halves Are Alike
function halvesAreAlike(s: string): boolean {
const vowels = new Set('aeiouAEIOU'.split(''));
let cnt = 0;
const n = s.length >> 1;
for (let i = 0; i < n; ++i) {
cnt += vowels.has(s[i]) ? 1 : 0;
cnt -= vowels.has(s[n + i]) ? 1 : 0;
}
return cnt === 0;
}
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.