zoukankan      html  css  js  c++  java
  • LeetCode 79. Word Search(单词搜索)

    Given a 2D board and a word, find if the word exists in the grid.

    The word can be constructed from letters of sequentially adjacent cell, where "adjacent" cells are those horizontally or vertically neighboring. The same letter cell may not be used more than once.

    For example,
    Given board =

    [
      ['A','B','C','E'],
      ['S','F','C','S'],
      ['A','D','E','E']
    ]
    
    word = "ABCCED", -> returns true,
    word = "SEE", -> returns true,
    word = "ABCB", -> returns false.

    题目标签:Array
      前两天都没有刷题,都在总结反省找工作失败的原因。因为现在租的房子也快到期了,就开始寻觅新的居所。突然之间,在昨天看完家附近的一个apartment之后,想到,既然也要搬家,为何不搬去一个更适合找工作,而且房租更便宜的地方呢! (主要还是因为穷!)回到家之后,调查研究一天,决定了!准备搬家到其他州,毕竟现在居住的地方(纽约长岛),不是非常适合new grad 找工作(主要是自己也不是大神,竞争不过别人)而且消费又高。巧的是,昨天虽然没刷题,但是上来看了一眼visits记录,发现居然有一个新的美国地区访问,就是我要去的地方(德州),这也算是缘分吧,闲话就扯到这里,开始继续说题。
     
      这道题目给了我们一个矩阵,让我们找到矩阵中是否存在一个word,但是这个word是需要左右上下连起来的。换一种说法,就是在这个board上走path, 能不能找到这个word的path。一般题目做多了,这种要探究所有可能性的,特别是要倒退回来继续探索其他方向的,基本大多都是backtracking。那么我们要走path,首先要找到起点,先遍历board,把和word的第一个字母一样的都当作起点代入我们的递归function。我们要记录每一个点的position,所以要row 和col;我们要记录word中的character,所以要一个wordIndex;最重要的是,我们需要判断,哪些点我们已经走过了,所以要一个boolean markBoard[][];对于起点(每一个点),最基本的思路是,可以走四个方向,把那个方向的下一个点继续递归,只要有一条path 成功了,返回回来就可以直接return了,不需要继续把所有的pathes 都看完;对于每一个点,要检查base case 1, word 是否已经找到了 return true; 还要检查base case 2,这个点是否可以探索(比如这个点超出board范围了,它和word中的char不相等,它已经被探索过了), return false。
     
     
     

    Java Solution:

    Runtime beats 34.54% 

    完成日期:07/27/2017

    关键词:Array

    关键点:Braktracking;新矩阵记录探索过的点;每个点有4个方向可以探索

     1 public class Solution 
     2 {
     3     public boolean exist(char[][] board, String word) 
     4     {
     5         if(board == null || board.length == 0 
     6                 || board.length * board[0].length < word.length())
     7             return false;
     8         
     9         boolean[][] mark = new boolean[board.length][board[0].length];
    10         boolean res = false;
    11         // iterate board, find the match starting character to pass to findWord function
    12         for(int i=0; i<board.length; i++)
    13         {
    14             for(int j=0; j<board[0].length; j++)
    15             {
    16                 if(board[i][j] == word.charAt(0))
    17                     res = res || findWord(board, word, 0, i, j, mark);
    18                 
    19                 if(res)
    20                     return res;
    21             }
    22         }
    23         
    24         return res;
    25     }
    26     
    27     public boolean findWord(char[][] board, String word, int wordIndex, 
    28             int row, int col, boolean[][] markBoard)
    29     {
    30         // base case 1: if exceed word's length, meaning it is done and found the word
    31         if(wordIndex == word.length())
    32             return true;
    33         
    34         /* base case 2: if this character is out of bound or 
    35          * this character is not match to word's character or 
    36          * hits character has been already visited
    37             */
    38         if(row >= board.length || row < 0 ||  col >= board[0].length || col < 0
    39                 || word.charAt(wordIndex) != board[row][col] || markBoard[row][col])
    40             return false;
    41         
    42         
    43         // mark this char as visited 
    44         markBoard[row][col] = true;
    45         
    46         // follow top, right, bottom, left order to check character
    47         // if any direction future path return true, meaning no need to continue other directions
    48         if(findWord(board, word, wordIndex + 1, row - 1, col, markBoard) || // go top
    49            findWord(board, word, wordIndex + 1, row, col + 1, markBoard) || // go right
    50            findWord(board, word, wordIndex + 1, row + 1, col, markBoard) || // go bottom:
    51            findWord(board, word, wordIndex + 1, row, col - 1, markBoard))   // go left:
    52         {
    53             return true;
    54         }
    55         
    56         markBoard[row][col] = false; // clear the mark of this character
    57 
    58         // if this this character's all four directions path has failed, return false to last level
    59         return false;
    60     }
    61 }

    参考资料:N/A

    LeetCode 算法题目列表 - LeetCode Algorithms Questions List

     
  • 相关阅读:
    hdu1874 畅通工程续
    hdu2544 最短路
    hdu1068 Girls and Boys
    hdu1151 Air Raid
    hdu1150 Machine Schedule
    hdu2063 过山车
    Bootstrap 学习笔记12 轮播插件
    Bootstrap 学习笔记11 按钮和折叠插件
    Bootstrap 学习笔记10 弹出框和警告框插件
    Bootstrap 学习笔记9 标签页和工具提示插件
  • 原文地址:https://www.cnblogs.com/jimmycheng/p/7248179.html
Copyright © 2011-2022 走看看