|A|B|C|E|
|S|F|C|S|
|A|D|E|E|
输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED"
输出:true
输入:board = [["a","b"],["c","d"]], word = "abcd"
输出:false
1 <= board.length <= 200
1 <= board[i].length <= 200
board 和 word 仅由大小写英文字母组成
func exist(_ board: [[Character]], _ word: String) -> Bool {
let maxY = board.count
let chars: [Character] = Array(word)
guard let maxX = board.first?.count, maxY > 0, maxX > 0 else {
return false
}
// 用于保存访问状态
var visited: [[Bool]] = Array(repeating: Array(repeating: false, count: maxX), count: maxY)
var pathLength = 0
for y in 0..<maxY {
for x in 0..<maxX {
if hasPathCore(board, chars, maxX: maxX, maxY: maxY, pathLength: &pathLength, x: x, y: y, visted: &visited) {
return true
}
}
}
return false
}
func hasPathCore(_ board: [[Character]], _ chars: [Character], maxX: Int, maxY: Int, pathLength: inout Int, x: Int, y: Int, visted: inout [[Bool]]) -> Bool {
if pathLength == chars.count {
return true
}
var result = false
if x >= 0, y >= 0,
x < maxX, y < maxY,
visted[y][x] == false,
board[y][x] == chars[pathLength]
{
pathLength += 1
visted[y][x] = true
result =
hasPathCore(board, chars, maxX: maxX, maxY: maxY, pathLength: &pathLength, x: x - 1, y: y, visted: &visted) ||
hasPathCore(board, chars, maxX: maxX, maxY: maxY, pathLength: &pathLength, x: x + 1, y: y, visted: &visted) ||
hasPathCore(board, chars, maxX: maxX, maxY: maxY, pathLength: &pathLength, x: x, y: y - 1, visted: &visted) ||
hasPathCore(board, chars, maxX: maxX, maxY: maxY, pathLength: &pathLength, x: x, y: y + 1, visted: &visted)
if result == false {
pathLength -= 1
visted[y][x] = false
}
}
return result
}