Coding questions · Zillow
Implement placeholder-based pattern matcher
Implement placeholder-based pattern matcher evaluates algorithm design, data structures, correctness, complexity, edge cases, and implementation details in a realistic interview setting. A strong answer states assumptions, handles edge cases, explains trade-offs, and shows how to validate the result clearly.
You are given:
- A string
sthat may contain placeholders delimited by the%character. - A dictionary
dictmapping keys (strings) to replacement values (strings).
A placeholder is any substring that starts and ends with %, for example %key%. The text between the two % characters (here, key) is used as a lookup key in dict.
Example:
s = "a%sd%fasd%dog%sdfisan"dict = { "sd": "HELLO", "dog": "CAT" }
Expected output:
"aHELLOfasdCATsdfisan"
Rules
- Parse
sfrom left to right. - Text outside of
%...%is copied directly to the output. - When you encounter a
%, you start reading a key until the next%:- The characters between the two
%characters form the key. - Look up this key in
dict. - If the key exists, append
dict[key]to the output. - If the key does not exist in
dict, the function should report an error (for example, by returning a special error value or throwing an exception; define your choice clearly in your solution).
- The characters between the two
- You may assume that
%characters are properly paired (no unmatched%). - There is no escaping mechanism for
%(every%starts or ends a placeholder).
Task
- Implement a function that performs this substitution according to the rules above.
- Clearly specify:
- The function signature in the programming language of your choice.
- How errors are represented/returned when a key is missing from
dict.
- Aim for a solution that runs in linear time in the length of
s(plus the cost of dictionary lookups).
What a Strong Answer Covers
- A clear algorithm with the right data structures and enough pseudocode or code-level detail to implement it.
- A correctness argument that explains why the algorithm covers all required cases.
- Time and space complexity, plus at least one alternative approach when relevant.
- Focused tests for normal cases, edge cases, and failure modes.
Follow-up Questions
- How would the approach change if the input were streaming or too large for memory?
- What invariants would you assert in production code?
- Which tests would catch off-by-one, duplicate, or tie-breaking bugs?
Placeholder Pattern Substitution
Hints
- Choose a representation that makes the requested operation direct.
- Handle empty inputs and boundary cases first.
Solution
Solution Alignment
The prompt asks for an implementation-level answer. The safest way to present it is to define the state, maintain clear invariants, then walk through complexity and tests.
Problem Restatement
You are given: 1. A string s that may contain placeholders delimited by the % character. 2. A dictionary dict mapping keys (strings) to replacement values (strings). A placeholder is any substring that starts and ends with %, for example %key%. The text between the two % characters (here, key) is used as a lookup key in dict. Example: - s = "a%sd%fasd%dog%sdfisan" - dict = { "sd": "HELLO", "dog": "CAT" } Expected output: - "aHELLOfasdCATsdfisan" ### Rules - Parse s from left to right. - Text outside of %...% is copied directly to the output. - When you encounter a %, you start reading a key until the next %: - The characters between the two % character...
Recommended Approach
Use the string constraints to choose between two pointers, a stack, frequency counts, prefix/suffix state, or dynamic programming. Maintain the invariant that processed characters have already been normalized, counted, or matched according to the operation.
Correctness
The implementation should maintain an invariant after each loop or operation that directly matches the problem statement. At termination, that invariant implies the returned value has considered every valid candidate exactly once, or has preserved the required data-structure state after every API call.
Complexity
Most direct string scans are O(n) time. Space ranges from O(1) for two pointers to O(n) for stacks, maps, or DP tables.
Edge Cases and Tests
Empty string, length 1, repeated characters, invalid characters, case sensitivity, Unicode vs ASCII, and very long input.