2120-执行所有后缀指令

Raphael Liu Lv10

现有一个 n x n 大小的网格,左上角单元格坐标 (0, 0) ,右下角单元格坐标 (n - 1, n - 1) 。给你整数 n
和一个整数数组 startPos ,其中 startPos = [startrow, startcol] 表示机器人最开始在坐标为
(startrow, startcol) 的单元格上。

另给你一个长度为 m 、下标从 0 开始的字符串 s ,其中 s[i] 是对机器人的第 i
条指令:'L'(向左移动),'R'(向右移动),'U'(向上移动)和 'D'(向下移动)。

机器人可以从 s 中的任一第 i 条指令开始执行。它将会逐条执行指令直到 s 的末尾,但在满足下述条件之一时,机器人将会停止:

  • 下一条指令将会导致机器人移动到网格外。
  • 没有指令可以执行。

返回一个长度为 m 的数组 answer ,其中 answer[i] 是机器人从第 i 条指令 开始 ,可以执行的
指令数目

示例 1:

**输入:** n = 3, startPos = [0,1], s = "RRDDLU"
**输出:** [1,5,4,3,1,0]
**解释:** 机器人从 startPos 出发,并从第 i 条指令开始执行:
- 0: " _ **R**_ RDDLU" 在移动到网格外之前,只能执行一条 "R" 指令。
- 1:  " _ **RDDLU**_ " 可以执行全部五条指令,机器人仍在网格内,最终到达 (0, 0) 。
- 2:   " _ **DDLU**_ " 可以执行全部四条指令,机器人仍在网格内,最终到达 (0, 0) 。
- 3:    " _ **DLU**_ " 可以执行全部三条指令,机器人仍在网格内,最终到达 (0, 0) 。
- 4:     " _ **L**_ U" 在移动到网格外之前,只能执行一条 "L" 指令。
- 5:      "U" 如果向上移动,将会移动到网格外。

示例 2:

**输入:** n = 2, startPos = [1,1], s = "LURD"
**输出:** [4,1,0,0]
**解释:**
- 0: " _ **LURD**_ "
- 1:  " _ **U**_ RD"
- 2:   "RD"
- 3:    "D"

示例 3:

**输入:** n = 1, startPos = [0,0], s = "LRUD"
**输出:** [0,0,0,0]
**解释:** 无论机器人从哪条指令开始执行,都会移动到网格外。

提示:

  • m == s.length
  • 1 <= n, m <= 500
  • startPos.length == 2
  • 0 <= startrow, startcol < n
  • s'L''R''U''D' 组成

方法一:模拟

思路与算法

我们直接从每一条指令开始,模拟机器人的运动路径即可。具体地,从第 i 条指令开始时,我们首先讲机器人置于 startPos 的位置,随后逐条执行指令。当遇到第 j 条 L, R, U, D 指令时,机器人会分别向左、右、上、下移动一个位置。如果机器人移动到了网格外,那么它可以执行 j - i 条指令。如果在所有指令执行完毕后,机器人仍然位于网格内,那么它可以执行全部的 m - i 条指令。

代码

[sol1-C++]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class Solution {
public:
vector<int> executeInstructions(int n, vector<int>& startPos, string s) {
int m = s.size();
vector<int> ans;
for (int i = 0; i < m; ++i) {
int x = startPos[0], y = startPos[1];
int cnt = m - i;
for (int j = i; j < m; ++j) {
char ch = s[j];
if (ch == 'L') {
--y;
}
else if (ch == 'R') {
++y;
}
else if (ch == 'U') {
--x;
}
else {
++x;
}
if (x < 0 || x >= n || y < 0 || y >= n) {
cnt = j - i;
break;
}
}
ans.push_back(cnt);
}
return ans;
}
};
[sol1-Python3]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution:
def executeInstructions(self, n: int, startPos: List[int], s: str) -> List[int]:
m = len(s)
ans = list()
for i in range(m):
x, y = startPos
cnt = m - i
for j in range(i, m):
ch = s[j]
if ch == "L":
y -= 1
elif ch == "R":
y += 1
elif ch == "U":
x -= 1
else:
x += 1
if x < 0 or x >= n or y < 0 or y >= n:
cnt = j - i
break
ans.append(cnt)
return ans

复杂度分析

  • 时间复杂度:O(m^2)。

  • 空间复杂度:O(1)。

 Comments
On this page
2120-执行所有后缀指令