题目描述
给定一个字符串 path
,其中 path[i]
的值可以是 'N'
、'S'
、'E'
或者 'W'
,分别表示向北、向南、向东、向西移动一个单位。
机器人从二维平面上的原点 (0, 0)
处开始出发,按 path
所指示的路径行走。
如果路径在任何位置上出现相交的情况,也就是走到之前已经走过的位置,请返回 True;否则,返回
False`。
样例
输入:path = "NES"
输出:false
解释:该路径没有在任何位置相交。
输入:path = "NESWW"
输出:true
解释:该路径经过原点两次。
限制
1 <= path.length <= 10^4
path
仅由{'N', 'S', 'E', 'W}
中的字符组成
算法
(哈希表) $O(n)$
- 用哈希表存储经过的点,如果某个点之前遇到过,返回
true
。
时间复杂度
- 哈希表的操作时间复杂度都是常数,故总时间复杂度为 $O(n)$。
空间复杂度
- 需要额外 $O(n)$ 的空间存储哈希表。
C++ 代码
class Solution {
public:
bool isPathCrossing(string path) {
int r = 0, c = 0;
unordered_set<string> seen;
seen.insert("0.0");
for (char ch : path) {
if (ch == 'N') r--;
else if (ch == 'S') r++;
else if (ch == 'E') c++;
else c--;
string str(to_string(r) + "." + to_string(c));
if (seen.find(str) != seen.end())
return true;
seen.insert(str);
}
return false;
}
};