use std::collections::HashSet;

impl Solution {
    pub fn is_path_crossing(path: String) -> bool {
        let mut visited = HashSet::from([(0, 0)]);

        let mut x = 0;
        let mut y = 0;
        for d in path.chars() {
            match d {
                'N' => y -= 1,
                'S' => y += 1,
                'E' => x += 1,
                'W' => x -= 1,
                _ => unreachable!("invalid direction"),
            }

            if visited.contains(&(x, y)) {
                return true;
            }
            visited.insert((x, y));
        }

        false
    }
}