1496 Path Crossing
Published:
Problem
Solution
Intuition
This problem requires us to trace a given path and identify if there are any intersections through the course of the path and return true if an intersection exists and false if no intersection exists.
The path can only move 1 unit at a time in a cardinal direction which makes this process a lot easier. We can simply keep track of each point that we have visited and then check to see if we visit it again. Using a hashset for this allows for quick look-up and makes our solution faster.
We start off at coordinates (0,0) and increment our x- or y-coordinate value as necessary based on the next move that our path takes us on. We store the coordinates as a tuple inside of a set, because a list is not hashable and therefore will not work for our needs.
Approach
- Initialize our x- and y-coordinates,
x_posandy_pos, to0’s. - Create a hashset,
visited, for tracking which cooridinates we have previously visited. - Add our initial position to
visited. - Iterate through each
movecharacter in the stringpath. - Update our position based on the
movethat we make. Check if this new position was previously reached and returnTrueif so. Add the current position tovisited. - Return
Falseif there are no repeated positions after looping through everymoveinpath.
Complexity
- Time complexity: $O(n)$. We loop iterate the entire string once and perform constant time operations during each iteration.
- Space complexity: $O(n)$. We utilize space to keep track of each position that is reached.
Code
class Solution:
def isPathCrossing(self, path: str) -> bool:
x_pos = y_pos = 0
visited = set()
visited.add((x_pos, y_pos))
for move in path:
if move == 'N':
y_pos += 1
if (x_pos, y_pos) in visited:
return True
visited.add((x_pos, y_pos))
if move == 'S':
y_pos -= 1
if (x_pos, y_pos) in visited:
return True
visited.add((x_pos, y_pos))
if move == 'E':
x_pos += 1
if (x_pos, y_pos) in visited:
return True
visited.add((x_pos, y_pos))
if move == 'W':
x_pos -= 1
if (x_pos, y_pos) in visited:
return True
visited.add((x_pos, y_pos))
return False
