[LeetCode] 1138. Alphabet Board Path 字母板上的路徑
On an alphabet board, we start at position(0, 0)
, corresponding to characterboard[0][0]
.
Here,board = ["abcde", "fghij", "klmno", "pqrst", "uvwxy", "z"]
, as shown in the diagram below.
We may make the following moves:
'U'
moves our position up one row, if the position exists on the board;'D'
moves our position down one row, if the position exists on the board;'L'
moves our position left one column, if the position exists on the board;'R'
moves our position right one column, if the position exists on the board;'!'
adds the characterboard[r][c]
at our current position(r, c)
to theanswer.
(Here, the only positions that exist on the board are positions with letters on them.)
Return a sequence of moves that makes our answer equal totarget
in the minimum number of moves. You may return any path that does so.
Example 1:
Input: target = "leet"
Output: "DDR!UURRR!!DDD!"
Example 2:
Input: target = "code"
Output: "RR!DDRR!UUL!R!"
Constraints:
1 <= target.length <= 100
target
這道題給了一個字母表盤,就是 26 個小寫字母按每行五個排列,形成一個二維陣列,共有六行,但第六行只有一個字母z。然後給了一個字串 target,起始位置是在a,現在讓分別按順序走到 target 上的所有字元,問經過的最短路徑是什麼。這不禁讓博主想到了智慧電視系統 Ruko 連線 wiki 時輸密碼的操作,因為只能用遙控器,也是一個字母表盤,然後按方向鍵移動到想要輸入的字母上,然後點選 OK,進行確認,再移動到下一個目標字元,跟這裡完全是一樣的操作。由於錶盤上的字母位置是固定的,所以不需要進行遍歷來找特定的字母,而是可以根據字母直接確定其在錶盤的上的座標,這樣當前字母和目標字母的座標都確定了,就可以直接找路徑了,其實就是個曼哈頓距離。由於路徑有很多條,只要保證距離最短都對,那麼就可以先走橫座標,或先走縱座標。其實這裡選方向挺重要,因為有個很 tricky 的情況,就是字母z,因為最後一行只有一個字母z,其不能往右走,只能往上走,所以這裡定一個規則,就是先往上走,再向右走。同理,從別的字母到z的話,也應該先往左走到頭,再往下走。順序確定好了,就可以想怎麼正確的生成路徑,往上的走的話,說明目標點在上方,則說明當前的x座標大,則用 curX - x,由於不一定需要向上走,所以這個差值有可能是負數,則需要跟0比較大小,取較大的那個。其他情況,都是同理的,往右走用目標y座標減去當前y座標;往左走,用當前y座標減去目標y座標;往下走,用目標x座標減去當前x座標,最後再加上感嘆號。結束一輪後,別忘了更新 curX 和 curY,參見程式碼如下:
class Solution {
public:
string alphabetBoardPath(string target) {
string res;
int curX = 0, curY = 0;
for (char c : target) {
int x = (c - 'a') / 5, y = (c - 'a') % 5;
res += string(max(0, curX - x), 'U') + string(max(0, y - curY), 'R') + string(max(0, curY - y), 'L') + string(max(0, x - curX), 'D') + '!';
curX = x;
curY = y;
}
return res;
}
};
Github 同步地址:
https://github.com/grandyang/leetcode/issues/1138
參考資料:
https://leetcode.com/problems/alphabet-board-path/
https://leetcode.com/problems/alphabet-board-path/discuss/345278/C%2B%2BJava-O(n)