Scala algorithm: Check word in grid (depth-first search)
Published
Algorithm goal
Determine whether a specified word exists contiguously a grid. The rules are: letters cannot be re-used, you can only go left, right, up, or down. For example, 'ALGO' is a word in the following grid:
ALGQ
WGRQ
WORQ
SWOD
There is the same problem but with a stack-safe Stack Safetysolution, at: CheckWordInGridStackSafe
Test cases in Scala
assert(
wordInGridDepthFirst(
Array(
Array('A', 'L', 'G', 'Q'),
Array('W', 'G', 'R', 'Q'),
Array('W', 'O', 'R', 'Q'),
Array('S', 'W', 'O', 'D')
),
"ALGO"
)
)
assert(
!wordInGridDepthFirst(
Array(
Array('A', 'L', 'E', 'Q'),
Array('W', 'G', 'R', 'Q'),
Array('W', 'L', 'R', 'Q'),
Array('S', 'W', 'O', 'D')
),
"ALGLE"
)
)
assert(
wordInGridDepthFirst(
Array(
Array('A', 'L', 'E', 'Q'),
Array('W', 'G', 'R', 'Q'),
Array('W', 'L', 'E', 'Q'),
Array('S', 'W', 'O', 'D')
),
"ALGLE"
)
)
Algorithm in Scala
31 lines of Scala (compatible versions 2.13 & 3.0), showing how concise Scala can be!
Explanation
For each index in the grid, we generate a point, and then during the downward traversal, we include points we have already seen in a separate Set. This allows us to not touch points we already have touched.
For a more stack-safe solution, see: CheckWordInGridStackSafe (Stack Safety). (this is © from www.scala-algorithms.com)
Scala concepts & Hints
Def Inside Def
A great aspect of Scala is being able to declare functions inside functions, making it possible to reduce repetition.
It is also frequently used in combination with Tail Recursion.
Range
The
(1 to n)
syntax produces a "Range" which is a representation of a sequence of numbers.