Implement WordGuess feedback scoring
Company: Verkada
Role: Software Engineer
Category: Coding & Algorithms
Difficulty: hard
Interview Round: Technical Screen
Quick Answer: This question evaluates proficiency in string processing, frequency counting, and edge-case handling by requiring implementation of Wordle-like feedback scoring for guess versus secret words.
Constraints
- For valid inputs, 1 <= len(secret) == len(guess) <= 100000
- Inputs may contain only lowercase English letters 'a' to 'z'; otherwise raise ValueError
Examples
Input: ('hello', 'abcde')
Expected Output: [0, 0, 0, 0, 1]
Explanation: There are no exact matches. Only the final 'e' exists in secret with unused availability, so only index 4 is YELLOW.
Input: ('hello', 'eabcd')
Expected Output: [1, 0, 0, 0, 0]
Explanation: There are no exact matches. The first letter 'e' exists in secret, so index 0 is YELLOW and the rest are GRAY.
Input: ('aabb', 'bbba')
Expected Output: [1, 0, 2, 1]
Explanation: Index 2 is GREEN. After removing that match, the remaining secret letters are 'a', 'a', and 'b', so only guess[0]='b' and guess[3]='a' can be YELLOW.
Input: ('apple', 'allee')
Expected Output: [2, 1, 0, 0, 2]
Explanation: Indices 0 and 4 are GREEN. Among the remaining secret letters, only one 'l' is available, so the second 'l' and the middle 'e' are GRAY.
Input: ('crate', 'trace')
Expected Output: [1, 2, 2, 1, 2]
Explanation: Indices 1, 2, and 4 are GREEN. The remaining secret letters are 'c' and 't', so guess[0]='t' and guess[3]='c' are YELLOW.
Input: ('z', 'z')
Expected Output: [2]
Explanation: Single-character exact match.
Solution
def solution(secret, guess):
if not isinstance(secret, str) or not isinstance(guess, str):
raise ValueError('secret and guess must be strings')
if len(secret) == 0 or len(guess) == 0:
raise ValueError('secret and guess must be non-empty')
if len(secret) != len(guess):
raise ValueError('secret and guess must have the same length')
for ch in secret:
if ch < 'a' or ch > 'z':
raise ValueError('secret contains invalid characters')
for ch in guess:
if ch < 'a' or ch > 'z':
raise ValueError('guess contains invalid characters')
n = len(secret)
result = [0] * n
remaining = [0] * 26
for i in range(n):
if guess[i] == secret[i]:
result[i] = 2
else:
remaining[ord(secret[i]) - ord('a')] += 1
for i in range(n):
if result[i] == 0:
idx = ord(guess[i]) - ord('a')
if remaining[idx] > 0:
result[i] = 1
remaining[idx] -= 1
return resultTime complexity: O(n). Space complexity: O(1) auxiliary space.
Hints
- Process the strings in two passes: mark exact matches first, then handle partial matches.
- Keep counts only for secret characters that were not matched as GREEN; a fixed-size array of length 26 is enough.