1. 程式人生 > 實用技巧 >leetcode刷題筆記七十九題 單詞搜尋

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
    }
}