zoukankan      html  css  js  c++  java
  • 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
        }
    }
  • 相关阅读:
    TCP,UDP协议下的socket通信
    socket套接字
    野指针
    各种数据类型与零值比较规范
    【C++复习】1.1基本概念
    【转载】C++中的static关键字的总结
    Windows10下搭建汇编语言开发环境(利用DOSBOX和MASM32)
    初试ARM开发板
    命令行中编译和运行JAVA程序出现“错误: 找不到或无法加载主类”
    用c语言产生随机数的方法
  • 原文地址:https://www.cnblogs.com/johnnyzhao/p/14184675.html
Copyright © 2011-2022 走看看