题目地址:
https://leetcode.com/problems/path-crossing/
给定一个长
n
n
n字符串
s
s
s,代表平面直角坐标系的一条路径,路径从
(
0
,
0
)
(0,0)
(0,0)出发,字符串只含'N', 'E', 'S', 'W'
分别代表北东南西四个方向。问路径是否自交。
直角用哈希表记录下路径即可。代码如下:
import java.util.HashSet;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
public class Solution {
class Pair {
int x, y;
public Pair(int x, int y) {
this.x = x;
this.y = y;
}
@Override
public boolean equals(Object o) {
Pair pair = (Pair) o;
return x == pair.x && y == pair.y;
}
@Override
public int hashCode() {
return Objects.hash(x, y);
}
}
public boolean isPathCrossing(String path) {
Set<Pair> set = new HashSet<>();
set.add(new Pair(0, 0));
int[] d = {1, 0, -1, 0, 1};
Map<Character, Integer> map = Map.of('N', 3, 'S', 1, 'E', 0, 'W', 2);
int x = 0, y = 0;
for (int i = 0; i < path.length(); i++) {
int idx = map.get(path.charAt(i));
x += d[idx];
y += d[idx + 1];
Pair next = new Pair(x, y);
if (set.contains(next)) {
return true;
}
set.add(next);
}
return false;
}
}
时空复杂度 O ( n ) O(n) O(n)。