3 minutes
Leetcode 1138
I have to admit the code might look daunting but it is actualy not that complicated after I explain it to you.
What the Problem is asking:
The problem asks us to make a board of letters:
[
[a, b, c, d, e]
[f, g, h, i, j]
[k, l, m, n, o]
[p, q, r, s, t]
[u, v, w, x, y]
[z]
]
Then it gives us a word target. We start at the position (0, 0) which is the letter a on the board.
We are asked to split target into letters and then go from the current position to the letter, and then from the new position to the next letter, and so on.
If we:
- go right then add a
Rto the result - go left then add a
Lto the result - go up then add a
Uto the result - go down then add a
Dto the result - reach the letter we add a
!to the result
We can show this with the following example:
input:
target = "leet"
output:
"DDR!UURRR!!DDD!"


The first letter is
lso we have to go to the letterlfroma. So we go2down and1right. So we addDDR!to the result.

The second letter is
eso we we have to first go up2and right3. Doing this we addUURRR!to the result.

The third letter is an
eas well, so we just have to add a!to the result.

Since the last letter is
twe just go down3from our current possition, so we just addDDD!to the result.
After we have finished we can see that our result is "DDR! + UURRR! + ! + DDD!" = "DDR!UURRR!!DDD!" and our expected output is "DDR!UURRR!!DDD!", and we can also see that our expected output is equal to our output.
func alphabetBoardPath(target string) string {
board := []string{"abcde", "fghij", "klmno", "pqrst", "uvwxy", "z"}
res := ""
row, col := 0, 0
for i := 0; i < len(target); i++ {
for newCol := 0; newCol < 6; newCol++ {
newRow := containsPosition(board[newCol], int32(target[i]))
if newRow != -1 { // this says that the row contains the letter
amountOfRowsLeft := abs(newCol - col)
if newCol > col {
for k := col; k < newCol; k++ {
if k > len(board)-3 {
i--
break
}
res += "D"
amountOfRowsLeft--
}
} else if newCol < col {
for k := 0; k < col-newCol; k++ {
res += "U"
amountOfRowsLeft--
}
}
if newRow > row {
for k := 0; k < newRow-row; k++ {
res += "R"
}
} else if newRow < row {
for k := 0; k < row-newRow; k++ {
res += "L"
}
}
if amountOfRowsLeft != 0 {
res += "D"
}
if amountOfRowsLeft == 0 {
res += "!"
}
row, col = newRow, newCol
break
}
}
}
return res
}
func containsPosition(theRow string, letter int32) int {
/*
This checks whether theRow contains the letter
*/
for i, i2 := range theRow {
if i2 == letter {
return i
}
}
return -1
}
func abs(a int) int {
if a > 0 {
return a
}
return -a
}