标签:lang tracking visit diff inpu rac constrain 如何 ons
Difficulty: Medium
Related Topics: Array, Backtracking
Given an m x n
board
and a word
, find if the word exists in the grid.
给定一个 m x n
的 board
和一个单词 word
,判断能不能在 board
里找到该单词。
The word can be constructed from letters of sequentially adjacent cells, where "adjacent" cells are horizontally or vertically neighboring. The same letter cell may not be used more than once.
单词可以由板子内若干相邻的单元格组成,这里的相邻指水平或垂直方向的相邻。同一个单元格最多只能使用一次。
Input: board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED"
Output: true
Input: board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "SEE"
Output: true
Input: board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCB"
Output: false
m == board.length
n = board[i].length
1 <= m, n <= 200
1 <= word.length <= 103
board
and word
consists only of lowercase and uppercase English letters.暴力搜索就完事了。不过在搜索的时候需要注意,对于不符合条件的情况,要尽快停止搜索。至于如何标记已经访问过的单元,这里采用了一个 visited 数组,代码如下:
class Solution {
fun exist(board: Array<CharArray>, word: String): Boolean {
val visited = Array(board.size) { BooleanArray(board[0].size) }
for (i in board.indices) {
for (j in board[i].indices) {
if (backtrack(board, i, j, word, 0, visited)) {
return true
}
}
}
return false
}
private fun backtrack(board: Array<CharArray>, i: Int, j: Int, word: String, index: Int, visited: Array<BooleanArray>): Boolean {
if (index == word.length) {
return true
}
if (i !in board.indices || j !in board[i].indices) {
return false
}
if (visited[i][j] || board[i][j] != word[index]) {
return false
}
visited[i][j] = true
val result = backtrack(board, i + 1, j, word, index + 1, visited) ||
backtrack(board, i - 1, j, word, index + 1, visited) ||
backtrack(board, i, j + 1, word, index + 1, visited) ||
backtrack(board, i, j - 1, word, index + 1, visited);
visited[i][j] = false
return result
}
}
[LeetCode] 79. Word Search(单词查找)
标签:lang tracking visit diff inpu rac constrain 如何 ons
原文地址:https://www.cnblogs.com/zhongju/p/14093133.html