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个方向可以探索

 public class Solution
{
public boolean exist(char[][] board, String word)
{
if(board == null || board.length == 0
|| board.length * board[0].length < word.length())
return false; boolean[][] mark = new boolean[board.length][board[0].length];
boolean res = false;
// iterate board, find the match starting character to pass to findWord function
for(int i=0; i<board.length; i++)
{
for(int j=0; j<board[0].length; j++)
{
if(board[i][j] == word.charAt(0))
res = res || findWord(board, word, 0, i, j, mark); if(res)
return res;
}
} return res;
} public boolean findWord(char[][] board, String word, int wordIndex,
int row, int col, boolean[][] markBoard)
{
// base case 1: if exceed word's length, meaning it is done and found the word
if(wordIndex == word.length())
return true; /* base case 2: if this character is out of bound or
* this character is not match to word's character or
* hits character has been already visited
*/
if(row >= board.length || row < 0 || col >= board[0].length || col < 0
|| word.charAt(wordIndex) != board[row][col] || markBoard[row][col])
return false; // mark this char as visited
markBoard[row][col] = true; // follow top, right, bottom, left order to check character
// if any direction future path return true, meaning no need to continue other directions
if(findWord(board, word, wordIndex + 1, row - 1, col, markBoard) || // go top
findWord(board, word, wordIndex + 1, row, col + 1, markBoard) || // go right
findWord(board, word, wordIndex + 1, row + 1, col, markBoard) || // go bottom:
findWord(board, word, wordIndex + 1, row, col - 1, markBoard)) // go left:
{
return true;
} markBoard[row][col] = false; // clear the mark of this character // if this this character's all four directions path has failed, return false to last level
return false;
}
}

参考资料:N/A

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

 

LeetCode 79. Word Search(单词搜索)的更多相关文章

  1. [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 l ...

  2. LeetCode 79. Word Search单词搜索 (C++)

    题目: Given a 2D board and a word, find if the word exists in the grid. The word can be constructed fr ...

  3. [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 l ...

  4. leetcode 79. Word Search 、212. Word Search II

    https://www.cnblogs.com/grandyang/p/4332313.html 在一个矩阵中能不能找到string的一条路径 这个题使用的是dfs.但这个题与number of is ...

  5. LeetCode 79 Word Search(单词查找)

    题目链接:https://leetcode.com/problems/word-search/#/description 给出一个二维字符表,并给出一个String类型的单词,查找该单词是否出现在该二 ...

  6. [LeetCode OJ] Word Search 深度优先搜索DFS

    Given a 2D board and a word, find if the word exists in the grid. The word can be constructed from l ...

  7. 079 Word Search 单词搜索

    给定一个二维面板和一个单词,找出该单词是否存在于网格中.这个词可由顺序相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格.同一个单元格内的字母不允许被重复使用.例如,给定 二 ...

  8. Leetcode79. Word Search单词搜索

    给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中"相邻"单元格是那些水平相邻或垂直相邻的单元格.同一个单元格内的字 ...

  9. Leetcode#79 Word Search

    原题地址 依次枚举起始点,DFS+回溯 代码: bool dfs(vector<vector<char> > &board, int r, int c, string ...

随机推荐

  1. 如何用一天时间实现自己的RPC框架

    前言 最近,闲来无事,自己写了一个简单的RPC框架,我把它叫做SimpleRpc.它有多简单?一共只有1400行代码.这个RPC只是作为自己试验作品,交流技术之用,当然如果你敢用,也可以放到生产环境之 ...

  2. GUI PasswordField

    GUI.PasswordField public static function PasswordField(position: Rect, password: string, maskChar: c ...

  3. nmap扫描某段网络连通性

    nmap -v -sP 10.0.10.0/24 进行ping扫描,打印出对扫描做出响应的主机,不做进一步测试(如端口扫描或者操作系统探测): nmap -sP 192.168.1.0/24 仅列出指 ...

  4. Spring 3.x 读书笔记

    第一:如果使用BeanFactory作为Spring Bean的工厂类,则所有的bean都是在第一次使用该Bean的时候实例化 第二:如果使用ApplicationContext作为Spring Be ...

  5. 由 System.arraycopy 引发的巩固:对象引用 与 对象 的区别

    作者:林冠宏 / 指尖下的幽灵 掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8 博客:http://www.cnblogs.com/linguan ...

  6. Redis缓存项目应用架构设计一

    一些项目整理出的项目中引入缓存的架构设计方案,希望能帮助你更好地管理项目缓存,作者水平有限,如有不足还望指点. 一.基础结构介绍 项目中对外提供方法的是CacheProvider和MQProvider ...

  7. windows Tomcat+Nginx 集群 迷你版

    一. 准备 两个Tomcat 加上Nginx 2. 创建一个公共的文件夹用于部署项目 3. Tomcat配置 配置内存 在catalina.bat 第一行增加 set JAVA_OPTS=-Xms51 ...

  8. 我的第一个python web开发框架(6)——第一个Hello World

    小白中午听完老菜讲的那些话后一直在思考,可想来想去还是一头雾水,晕晕呼呼的一知半解,到最后还是想不明白,心想:老大讲的太高深了,只能听懂一半半,看来只能先记下来,将明白的先做,不明白的等以后遇到再学. ...

  9. 给vue项目添加ESLint

    eslint配置方式有两种: 注释配置:使用js注释来直接嵌入ESLint配置信息到一个文件里 配置文件:使用一个js,JSON或者YAML文件来给整个目录和它的子目录指定配置信息.这些配置可以写在一 ...

  10. Intel Core Microarchitecture Pipeline

    Intel微处理器近20年从Pentium发展到Skylake,得益于制作工艺上的巨大发展,处理器的性能得到了非常大的增强,功能模块增多,不过其指令处理pipeline的主干部分算不上有特别大的变化, ...