TIP102 Unit 3 Session 1 Advanced (Click for link to problem statements)
Understand what the interviewer is asking for by using test cases and questions about the problem.
event
, which needs to be placed on the timeline, and timeline
, which represents the target state we want to achieve.event
was placed on the timeline to transform it into the timeline
string. If it's not possible, return an empty array.event
must be fully contained within the boundaries of the timeline when placed. The transformation must be achieved within 10 * timeline.length
turns.Plan the solution with appropriate visualizations and pseudocode.
General Idea: Use a breadth-first search (BFS) approach to explore all possible ways of placing the event
on the timeline. Track the placements and determine if the timeline can be fully transformed into the target string within the allowed number of turns.
1. Initialize the string `t` as a list of `?` characters with the same length as the `timeline`.
2. Create a queue to manage the states of `t` and the sequence of indices where `event` has been placed.
3. Define a function `can_place(t, event, start)` to check if `event` can be placed on `t` starting at index `start`.
4. Define a function `place_event(t, event, start)` to place the `event` on `t` at the specified index and return the new state of `t`.
5. Perform a BFS:
1. Initialize the BFS with the initial state of `t` and an empty list of indices.
2. For each state, attempt to place `event` at all possible positions.
3. If the resulting string matches `timeline`, return the list of indices.
4. If no solution is found after `10 * timeline.length` turns, return an empty array.
6. Return the result.
⚠️ Common Mistakes
event
can be placed at a given position.event
during the BFS.from collections import deque
def mark_event_timeline(event, timeline):
t_len = len(timeline)
event_len = len(event)
queue = deque([(['?'] * t_len, [])])
max_turns = 10 * t_len
def can_place(t, event, start):
for i in range(event_len):
if t[start + i] != '?' and t[start + i] != event[i]:
return False
return True
def place_event(t, event, start):
new_t = t[:]
for i in range(event_len):
new_t[start + i] = event[i]
return new_t
turns = 0
while queue and turns < max_turns:
current_t, indices = queue.popleft()
for i in range(t_len - event_len + 1):
if can_place(current_t, event, i):
new_t = place_event(current_t, event, i)
new_indices = indices + [i]
if ''.join(new_t) == timeline:
return new_indices
queue.append((new_t, new_indices))
turns += 1
return []
# Example usage
print(mark_event_timeline("abc", "ababc")) # Output: [0, 2]
print(mark_event_timeline("abca", "aabcaca")) # Output: [3, 0, 1]