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.
Move from brute-force thinking to an efficient approach using core interview patterns strategy.
You are given an array of strings words and an integer k.
Two words a and b at distinct indices are prefix-connected if a[0..k-1] == b[0..k-1].
A connected group is a set of words such that each pair of words is prefix-connected.
Return the number of connected groups that contain at least two words, formed from the given words.
Note:
k cannot join any group and are ignored.Example 1:
Input: words = ["apple","apply","banana","bandit"], k = 2
Output: 2
Explanation:
Words sharing the same first k = 2 letters are grouped together:
words[0] = "apple" and words[1] = "apply" share prefix "ap".words[2] = "banana" and words[3] = "bandit" share prefix "ba".Thus, there are 2 connected groups, each containing at least two words.
Example 2:
Input: words = ["car","cat","cartoon"], k = 3
Output: 1
Explanation:
Words are evaluated for a prefix of length k = 3:
words[0] = "car" and words[2] = "cartoon" share prefix "car".words[1] = "cat" does not share a 3-length prefix with any other word.Thus, there is 1 connected group.
Example 3:
Input: words = ["bat","dog","dog","doggy","bat"], k = 3
Output: 2
Explanation:
Words are evaluated for a prefix of length k = 3:
words[0] = "bat" and words[4] = "bat" form a group.words[1] = "dog", words[2] = "dog" and words[3] = "doggy" share prefix "dog".Thus, there are 2 connected groups, each containing at least two words.
Constraints:
1 <= words.length <= 50001 <= words[i].length <= 1001 <= k <= 100words consist of lowercase English letters.Problem summary: You are given an array of strings words and an integer k. Two words a and b at distinct indices are prefix-connected if a[0..k-1] == b[0..k-1]. A connected group is a set of words such that each pair of words is prefix-connected. Return the number of connected groups that contain at least two words, formed from the given words. Note: Words with length less than k cannot join any group and are ignored. Duplicate strings are treated as separate words.
Start with the most direct exhaustive search. That gives a correctness anchor before optimizing.
Pattern signal: General problem-solving
["apple","apply","banana","bandit"] 2
["car","cat","cartoon"] 3
["bat","dog","dog","doggy","bat"] 3
Source-backed implementations are provided below for direct study and interview prep.
// Accepted solution for LeetCode #3839: Number of Prefix Connected Groups
class Solution {
public int prefixConnected(String[] words, int k) {
Map<String, Integer> cnt = new HashMap<>();
for (var w : words) {
if (w.length() >= k) {
cnt.merge(w.substring(0, k), 1, Integer::sum);
}
}
int ans = 0;
for (var v : cnt.values()) {
if (v > 1) {
++ans;
}
}
return ans;
}
}
// Accepted solution for LeetCode #3839: Number of Prefix Connected Groups
func prefixConnected(words []string, k int) int {
cnt := make(map[string]int)
for _, w := range words {
if len(w) >= k {
cnt[w[:k]]++
}
}
ans := 0
for _, v := range cnt {
if v > 1 {
ans++
}
}
return ans
}
# Accepted solution for LeetCode #3839: Number of Prefix Connected Groups
class Solution:
def prefixConnected(self, words: List[str], k: int) -> int:
cnt = Counter()
for w in words:
if len(w) >= k:
cnt[w[:k]] += 1
return sum(v > 1 for v in cnt.values())
// Accepted solution for LeetCode #3839: Number of Prefix Connected Groups
// Rust example auto-generated from java reference.
// Replace the signature and local types with the exact LeetCode harness for this problem.
impl Solution {
pub fn rust_example() {
// Port the logic from the reference block below.
}
}
// Reference (java):
// // Accepted solution for LeetCode #3839: Number of Prefix Connected Groups
// class Solution {
// public int prefixConnected(String[] words, int k) {
// Map<String, Integer> cnt = new HashMap<>();
// for (var w : words) {
// if (w.length() >= k) {
// cnt.merge(w.substring(0, k), 1, Integer::sum);
// }
// }
// int ans = 0;
// for (var v : cnt.values()) {
// if (v > 1) {
// ++ans;
// }
// }
// return ans;
// }
// }
// Accepted solution for LeetCode #3839: Number of Prefix Connected Groups
function prefixConnected(words: string[], k: number): number {
const cnt = new Map<string, number>();
for (const w of words) {
if (w.length >= k) {
const key = w.substring(0, k);
cnt.set(key, (cnt.get(key) ?? 0) + 1);
}
}
let ans = 0;
for (const v of cnt.values()) {
if (v > 1) {
ans++;
}
}
return ans;
}
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.