leetcode刷题笔记七十九题 单词搜索
源地址:79. 单词搜索
问题描述:
给定一个二维网格和一个单词,找出该单词是否存在于网格中。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
示例:
board =
[
['A','B','C','E'],
['S','F','C','S'],
['A','D','E','E']
]给定 word = "ABCCED", 返回 true
给定 word = "SEE", 返回 true
给定 word = "ABCB", 返回 false
/**
本题也是一道回溯法相关的题目
与之前的回溯问题不同的是,我们要在上下左右四个方向上进行回溯
需要注意的是对边界问题的处理
*/
object Solution {
def exist(board: Array[Array[Char]], word: String): Boolean = {
//特殊情况处理
val row = board.length
if (row == 0) return false
val col = board(0).length
val strLen = word.length
def dfs(rowY: Int, colX: Int, length: Int): Boolean = {
//从0开始,length时所有字母已经匹配
if(length == word.length) return true
//判断是否越界 及 单词是否对应
else if(rowY < 0 || rowY >= row || colX < 0 || colX >= col || board(rowY)(colX) != word(length)) return false
//单个匹配情况下进行回溯
else {
val tempChar = board(rowY)(colX)
//标记已使用字符
board(rowY)(colX) = '#'
//从四个方向进行探索
val ans = dfs(rowY, colX-1,length+1) || dfs(rowY-1, colX,length+1) || dfs(rowY, colX+1,length+1) || dfs(rowY+1, colX,length+1)
//回溯
board(rowY)(colX) = tempChar
return ans
}
}
for(i <- 0 to row-1; j <- 0 to col-1){
if (dfs(i, j, 0) == true)
return true
}
return false
}
}