79. Word Search

package LeetCode_79

/**
 * 79. Word Search
 * https://leetcode.com/problems/word-search/
 * Given an m x n board and a word, find if the word exists in the grid.
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.

Example 1:
Input: board = [
["A","B","C","E"],
["S","F","C","S"],
["A","D","E","E"]], word = "ABCCED"
Output: true

Example 2:
Input: board = [
["A","B","C","E"],
["S","F","C","S"],
["A","D","E","E"]], word = "ABCB"
Output: false
 * */
class Solution {
    /*
    * Solution 1: BFS: failure, because BFS just can for:
    * 1) check whether there is a path between two point and whether can be reach;
    * 2) find out the shortest path between two point;
    *
    * Solution 2: DFS, find out the accurate path,
    * Time: O(m*n*4^l), l is length of word, because each letter has 4 path to check,
    * Space: O(m*n+l)
    * */
    fun exist(board: Array<CharArray>, word: String): Boolean {
        val m = board.size
        val n = board[0].size
        for (i in 0 until m) {
            for (j in 0 until n) {
                if (dfs(0, board, i, j, word)) {
                    return true
                }
            }
        }
        return false
    }

    private fun dfs(index: Int, board: Array<CharArray>, x: Int, y: Int, word: String): Boolean {
        if (x < 0 || y < 0 || x >= board.size || y >= board[0].size) {
            return false
        }
        if (board[x][y] != word[index]) {
            return false
        }
        if (index == word.length - 1) {
            return true
        }
        //avoid visited same position again
        val temp = board[x][y]
        board[x][y] = '#'
        //check 4 directions
        val exists = dfs(index + 1, board, x + 1, y, word) ||
                dfs(index + 1, board, x - 1, y, word) ||
                dfs(index + 1, board, x, y + 1, word) ||
                dfs(index + 1, board, x, y - 1, word)
        //set back for next level
        board[x][y] = temp
        return exists
    }
}
原文地址:https://www.cnblogs.com/johnnyzhao/p/14184675.html