现有一个 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: "RRDDLU" 在移动到网格外之前,只能执行一条 "R" 指令。 - 1: "RDDLU" 可以执行全部五条指令,机器人仍在网格内,最终到达 (0, 0) 。 - 2: "DDLU" 可以执行全部四条指令,机器人仍在网格内,最终到达 (0, 0) 。 - 3: "DLU" 可以执行全部三条指令,机器人仍在网格内,最终到达 (0, 0) 。 - 4: "LU" 在移动到网格外之前,只能执行一条 "L" 指令。 - 5: "U" 如果向上移动,将会移动到网格外。
示例 2:
输入:n = 2, startPos = [1,1], s = "LURD" 输出:[4,1,0,0] 解释: - 0: "LURD" - 1: "URD" - 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'
组成
直接模拟。
class Solution:
def executeInstructions(self, n: int, startPos: List[int], s: str) -> List[int]:
ans = []
m = len(s)
mp = {"L": [0, -1], "R": [0, 1], "U": [-1, 0], "D": [1, 0]}
for i in range(m):
x, y = startPos
t = 0
for j in range(i, m):
a, b = mp[s[j]]
if 0 <= x + a < n and 0 <= y + b < n:
x, y, t = x + a, y + b, t + 1
else:
break
ans.append(t)
return ans
class Solution {
public int[] executeInstructions(int n, int[] startPos, String s) {
int m = s.length();
int[] ans = new int[m];
Map<Character, int[]> mp = new HashMap<>(4);
mp.put('L', new int[] {0, -1});
mp.put('R', new int[] {0, 1});
mp.put('U', new int[] {-1, 0});
mp.put('D', new int[] {1, 0});
for (int i = 0; i < m; ++i) {
int x = startPos[0], y = startPos[1];
int t = 0;
for (int j = i; j < m; ++j) {
char c = s.charAt(j);
int a = mp.get(c)[0], b = mp.get(c)[1];
if (0 <= x + a && x + a < n && 0 <= y + b && y + b < n) {
x += a;
y += b;
++t;
} else {
break;
}
}
ans[i] = t;
}
return ans;
}
}
class Solution {
public:
vector<int> executeInstructions(int n, vector<int>& startPos, string s) {
int m = s.size();
vector<int> ans(m);
unordered_map<char, vector<int>> mp;
mp['L'] = {0, -1};
mp['R'] = {0, 1};
mp['U'] = {-1, 0};
mp['D'] = {1, 0};
for (int i = 0; i < m; ++i) {
int x = startPos[0], y = startPos[1];
int t = 0;
for (int j = i; j < m; ++j) {
int a = mp[s[j]][0], b = mp[s[j]][1];
if (0 <= x + a && x + a < n && 0 <= y + b && y + b < n) {
x += a;
y += b;
++t;
} else
break;
}
ans[i] = t;
}
return ans;
}
};
func executeInstructions(n int, startPos []int, s string) []int {
m := len(s)
mp := make(map[byte][]int)
mp['L'] = []int{0, -1}
mp['R'] = []int{0, 1}
mp['U'] = []int{-1, 0}
mp['D'] = []int{1, 0}
ans := make([]int, m)
for i := 0; i < m; i++ {
x, y := startPos[0], startPos[1]
t := 0
for j := i; j < m; j++ {
a, b := mp[s[j]][0], mp[s[j]][1]
if 0 <= x+a && x+a < n && 0 <= y+b && y+b < n {
x += a
y += b
t++
} else {
break
}
}
ans[i] = t
}
return ans
}
function executeInstructions(n: number, startPos: number[], s: string): number[] {
const m = s.length;
const ans = new Array(m);
for (let i = 0; i < m; i++) {
let [y, x] = startPos;
let j: number;
for (j = i; j < m; j++) {
const c = s[j];
if (c === 'U') {
y--;
} else if (c === 'D') {
y++;
} else if (c === 'L') {
x--;
} else {
x++;
}
if (y === -1 || y === n || x === -1 || x === n) {
break;
}
}
ans[i] = j - i;
}
return ans;
}
impl Solution {
pub fn execute_instructions(n: i32, start_pos: Vec<i32>, s: String) -> Vec<i32> {
let s = s.as_bytes();
let m = s.len();
let mut ans = vec![0; m];
for i in 0..m {
let mut y = start_pos[0];
let mut x = start_pos[1];
let mut j = i;
while j < m {
match s[j] {
b'U' => y -= 1,
b'D' => y += 1,
b'L' => x -= 1,
_ => x += 1,
}
if y == -1 || y == n || x == -1 || x == n {
break;
}
j += 1;
}
ans[i] = (j - i) as i32;
}
ans
}
}
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* executeInstructions(int n, int* startPos, int startPosSize, char* s, int* returnSize) {
int m = strlen(s);
int* ans = malloc(sizeof(int) * m);
for (int i = 0; i < m; i++) {
int y = startPos[0];
int x = startPos[1];
int j = i;
for (j = i; j < m; j++) {
if (s[j] == 'U') {
y--;
} else if (s[j] == 'D') {
y++;
} else if (s[j] == 'L') {
x--;
} else {
x++;
}
if (y == -1 || y == n || x == -1 || x == n) {
break;
}
}
ans[i] = j - i;
}
*returnSize = m;
return ans;
}