题目链接:https://leetcode.com/problems/word-search/#/description

给出一个二维字符表,并给出一个String类型的单词,查找该单词是否出现在该二维字符表中。

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.

同样还是使用第78题的方法,也就是回溯法求解。

通过上述例子,每次都是只能查找当前位置的上下左右四个位置(最多是四个位置,还有边界情况)。当查找到该单词的某个位置时,通过计数器不断更新当前已经匹配的字符的个数。

通过移动查找的坐标(row,col)来进行对一棵树的深度遍历操作。也就是dfs遍历操作。

调用dfs遍历的循环是有两层的。每次当遍历的一棵子树到叶子节点时,重新进入原始的循环体。更新树的遍历根节点。

因此循环体为

for(int i = 0 ; i < row ; i++){
for(int j = 0 ; j < col ; j++){
dfs();// calling the function to go through the tree
}
}

需要考虑递归函数的出口问题:因为需要对单词中的每个字符进行匹配操作,所以设置计数器用来统计当前所匹配的字符个数,同时也可以使用该变量来得到接下来要匹配的单词的字符。

如果给计数器个数等于单词的长度时,说明单词的所有字符都可以在表中找到,此时返回结果为true

如果当前的位置上下左右四个cell都不能与单词的字符进行匹配时,此时递归函数应退出并放回结果为false;

上面考虑了递归函数的出口问题,下面是对整个问题的结果进行讨论。

当有一个位置能够查找到目标单词的所有字符时就应该返回true,

当遍历开始位置从(0,0)到(board.row, board.col)结束都没有查找到时,返回false;

根据上述分析,得到以下参考代码:

package leetcode_100;

/***
*
* @author pengfei_zheng
* 二维字符表中查找单词
*/
public class Solution79 {
public static boolean exist(char[][] board, String word) {
int row = board.length;
int col = board[0].length;
boolean[][] visited = new boolean[row][col];//record whether this cell is visited
for(int i=0;i<row;i++)
for(int j=0;j<col;j++)
if(dfs(board,visited,i,j,0,word))// calling the function to check word
return true;//if this start position(i,j) can match the word then just return true return false;//if all the position can't match the word then return false
} private static boolean dfs(char[][] board, boolean[][] visited, int row, int col, int index, String word) {
if(word.length() == index){//judge whether match the word
return true;
}
if(row<0 || col<0|| row>=board.length || col>=board[0].length) return false;//considering the boundary
char ch = word.charAt(index);//get next Character
if(!visited[row][col] && ch == board[row][col]){// this position can match the Character
visited[row][col] = true;
//calling itself going through the tree
//four conditions: up && down && left && right
boolean res = dfs(board,visited,row-1,col,index+1,word)|| dfs(board,visited,row+1,col,index+1,word)
||dfs(board,visited,row,col-1,index+1,word)|| dfs(board,visited,row,col+1,index+1,word);
visited[row][col] = false;
return res;
}
return false;//not found
}
}
 

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(单词搜索)

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

  6. Leetcode#79 Word Search

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

  7. [LeetCode] 212. Word Search II 词语搜索 II

    Given a 2D board and a list of words from the dictionary, find all words in the board. Each word mus ...

  8. Java for LeetCode 212 Word Search II

    Given a 2D board and a list of words from the dictionary, find all words in the board. Each word mus ...

  9. 刷题79. Word Search

    一.题目说明 题目79. Word Search,给定一个由字符组成的矩阵,从矩阵中查找一个字符串是否存在.可以连续横.纵找.不能重复使用,难度是Medium. 二.我的解答 惭愧,我写了很久总是有问 ...

随机推荐

  1. 非常酷的jQuery/HTML5图片滑块特效 带弹性菜单

    新的一周刚刚开始,当我迷迷糊糊坐在办公桌前时,又不自主的去看了一些jQuery和HTML5的应用插件,今天我们来看一款非常酷的jQuery/HTML5图片滑块特效,这款插件的特点是图片上不错的弹性菜单 ...

  2. git解决冲突(rebase版)

    当使用git rebase碰到冲突时, git rebase <Remote Branch>/<Your Branch> 信息如下: error: Failed to merg ...

  3. unity3d 获取游戏对象详解

    原文地址:http://www.xuanyusong.com/archives/2768 我觉得Unity里面的Transform 和 GameObject就像两个双胞胎兄弟一样,这俩哥们很要好,我能 ...

  4. CentOS7 防火墙配置(关闭)

    CentOS7 的防火墙配置跟曾经版本号有非常大差别,经过大量尝试,最终找到解决这个问题的关键 CentOS7这个版本号的防火墙默认使用的是firewall.与之前的版本号使用iptables不一样. ...

  5. 生成asm-offset

    因为不善于在Makefile中调用shell的相关工具,所以关于asm-offsets.h中的产生的16进制数并不知如何做到. 因此自己写了个脚本,可以生成同样的文件(再次造了轮子). 参考:http ...

  6. MysqlHelper使用反射机制智能推算数据类型以及属性名称

    public class MySqlHelper { private string ConnString; public MySqlHelper(string connectionString) { ...

  7. phpcms v9模板制作常用代码集合(转)

    phpcms v9模板制作常用代码集合(个人收藏) 1.截取调用标题长度 {str_cut($r[title],36,'')} 2.格式化时间 调用格式化时间 2011-05-06 11:22:33 ...

  8. 2、一、Introduction(入门):1、Application Fundamentals(应用程序基础)

    一.Introduction(入门) 1.Application Fundamentals(应用程序基础) Android apps are written in the Java programmi ...

  9. PHP开发中,让var_dump调试函数输出更美观 ^_^#

    前提:php必须安装Xdebug模块. 用var_dump打印输出时,输出的内容没有被格式化.如下图: 通常使用var_dump打印的内容是被格式化后输出的,如下图: 造成没有格式化输出的原因是因为p ...

  10. 【视频】ffmpeg mov mp4 m3u8 ts

    1.https://ffmpeg.zeranoe.com/builds/ 2.https://blog.csdn.net/psh18513234633/article/details/79312607 ...