列表

详情


1138. 字母板上的路径

我们从一块字母板上的位置 (0, 0) 出发,该坐标对应的字符为 board[0][0]

在本题里,字母板为board = ["abcde", "fghij", "klmno", "pqrst", "uvwxy", "z"],如下所示。

我们可以按下面的指令规则行动:

(注意,字母板上只存在有字母的位置。)

返回指令序列,用最小的行动次数让答案和目标 target 相同。你可以返回任何达成目标的路径。

 

示例 1:

输入:target = "leet"
输出:"DDR!UURRR!!DDD!"

示例 2:

输入:target = "code"
输出:"RR!DDRR!UUL!R!"

 

提示:

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: string alphabetBoardPath(string target) { } };

golang 解法, 执行用时: 0 ms, 内存消耗: 1.9 MB, 提交时间: 2023-02-12 13:39:20

func alphabetBoardPath(target string) string {
	ans := []byte{}
	var i, j int
	for _, c := range target {
		v := int(c - 'a')
		x, y := v/5, v%5
		for j > y {
			j--
			ans = append(ans, 'L')
		}
		for i > x {
			i--
			ans = append(ans, 'U')
		}
		for j < y {
			j++
			ans = append(ans, 'R')
		}
		for i < x {
			i++
			ans = append(ans, 'D')
		}
		ans = append(ans, '!')
	}
	return string(ans)
}

golang 解法, 执行用时: 0 ms, 内存消耗: 1.8 MB, 提交时间: 2023-02-12 13:38:00

func alphabetBoardPath(target string) string {
    ans := []byte{}
    x, y := 0, 0
    for _, c := range target {
        nx, ny := int(c-'a')/5, int(c-'a')%5 // 目标位置
        v := strings.Repeat(string("UD"[b2i(nx > x)]), abs(nx-x)) // 竖直
        h := strings.Repeat(string("LR"[b2i(ny > y)]), abs(ny-y)) // 水平
        if c == 'z' {
            v, h = h, v
        }
        ans = append(ans, v+h+"!"...)
        x, y = nx, ny
    }
    return string(ans)
}

func b2i(b bool) int { if b { return 1 }; return 0 }
func abs(x int) int { if x < 0 { return -x }; return x }

cpp 解法, 执行用时: 0 ms, 内存消耗: 5.9 MB, 提交时间: 2023-02-12 13:37:40

class Solution {
public:
    string alphabetBoardPath(string target) {
        string ans;
        int x = 0, y = 0;
        for (char c : target) {
            int nx = (c - 'a') / 5, ny = (c - 'a') % 5; // 目标位置
            string v(abs(nx - x), "UD"[nx > x]); // 竖直
            string h(abs(ny - y), "LR"[ny > y]); // 水平
            ans += (c != 'z' ? v + h : h + v) + "!";
            x = nx, y = ny;
        }
        return ans;
    }
};

java 解法, 执行用时: 1 ms, 内存消耗: 39.8 MB, 提交时间: 2023-02-12 13:37:25

class Solution {
    public String alphabetBoardPath(String target) {
        var ans = new StringBuilder();
        int x = 0, y = 0;
        for (var c : target.toCharArray()) {
            int nx = (c - 'a') / 5, ny = (c - 'a') % 5; // 目标位置
            var v = nx < x ? "U".repeat(x - nx) : "D".repeat(nx - x); // 竖直
            var h = ny < y ? "L".repeat(y - ny) : "R".repeat(ny - y); // 水平
            ans.append(c != 'z' ? v + h : h + v).append('!');
            x = nx;
            y = ny;
        }
        return ans.toString();
    }
}

python3 解法, 执行用时: 44 ms, 内存消耗: 14.9 MB, 提交时间: 2023-02-12 13:36:25

class Solution:
    def alphabetBoardPath(self, target: str) -> str:
        ans = []
        x = y = 0
        for c in target:
            nx, ny = divmod(ord(c) - ord('a'), 5)  # 目标位置
            v = "UD"[nx > x] * abs(nx - x)  # 竖直
            h = "LR"[ny > y] * abs(ny - y)  # 水平
            ans.append((v + h if c != 'z' else h + v) + "!")
            x, y = nx, ny
        return ''.join(ans)

上一题