leetcode刷题笔记七十九题 单词搜索

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
    }
}
posted @ 2020-07-23 17:32  ganshuoos  阅读(116)  评论(0编辑  收藏  举报