技术标签: dfs 算法 java leetcode LeetCode
话不多说,直接上题目链接,79.单词搜索 。题目描述如下:
这是一道典型的 DFS (深度优先搜索)的题目,深度优先搜索的精髓就是递归,从某个节点开始遍历其邻近的节点,如果邻近的节点被访问过就不再访问,如果邻近的节点没有被访问过,那么就访问邻近的节点,这里的邻近指的是相邻的意思。然后再访问邻近节点的邻近节点,知道节点全部被访问才结束。这是一种图的遍历的方法,与之相对的还广度优先搜索 BFS ,关于广度优先搜索在下一次题目讲解中将会介绍。
那么这道题我们就用 DFS 来做,首先我们要构造一个深度优先搜索的函数,来对输入的二维网格进行遍历。题目要求是要找到在网格中是否有给定 word 的匹配。我们知道一个 word 里有很多个字母,我们要一个字母一个字母的匹配。而在题目要求:
也就是说,假如我们在二维数组board [i] [j] 里找到了一个字母和 word 的首字母匹配,然后匹配的第二个字母必须是这个board [i] [j] 的上下左右间距为1,如果没有就返回1。
所以我们的思路就很清晰了,首先遍历题目所给 word ,并在二维网格里找到能够匹配到 word 的第一个字母的坐标,然后在这个坐标下,进行上下左右的移动和试探,试图找到能够与 word 的第二个字母匹配的坐标,如果找到了,再在找到的坐标进行上下左右的移动,识图找到能够与 word 第三个字母匹配的坐标。如果找到了继续进行下去,如果没有找到,那么这次匹配失败,再找能够与 word 首字母匹配的坐标。
class Solution {
//方向数组
public static int[][] dir = {
{
0,-1},{
0,1},{
-1,0},{
1,0}};
//从单词的第一个字母开始
public static int index = 0;
//访问数组 用来存储元素是否被访问
public static int[][] visted;
public boolean exist(char[][] board, String word) {
//特殊处理
if(word==null || word.equals("")){
return false;
}
//初始化visted数组
int row = board.length;
int col = board[0].length;
visted = new int[row][col];
//初始化index
index = 1;
//从图中匹配
for(int i = 0;i<row;++i){
for(int j = 0;j<col;++j){
//如果未被访问而且匹配到单词的第一个字母
if(visted[i][j]==0 && board[i][j]==word.charAt(0)){
visted[i][j] = 1;
//从这个字母开始进行第二个字母的匹配
if(dfs(i,j,1,word,board)){
return true;
}
visted[i][j] = 0;
}
}
}
return false;
}
//dfs 遍历
public boolean dfs(int x,int y,int deep,String word,char[][] board){
//获取单词长度
int len = word.length();
//获取二维网格的行和列
int row = board.length;
int col = board[0].length;
//条件 当到单词末尾 并且最后一个字母也找到
if(deep==len && board[x][y]==word.charAt(len-1)){
return true;
}
//从四个方向上进行遍历
for(int i = 0;i<4;++i){
int tempx = x + dir[i][0];
int tempy = y + dir[i][1];
//边界条件
if(tempx < 0 || tempy >= col || tempx >= row || tempy < 0 || visted[tempx][tempy]==1 || board[tempx][tempy]!=word.charAt(index)){
continue;
}else{
//当前访问过的点置1
visted[tempx][tempy] = 1;
//匹配下一个字母
index++;
if(dfs(tempx,tempy,deep+1,word,board)){
return true;
}
//没有匹配到
index--;
visted[tempx][tempy] = 0;
}
}
return false;
}
}
登录到http://localhost:8080页面,当忘记管理员(tomcat manager)帐号与密码时找到tomcat的安装文件夹,在conf文件夹里有一个tomcat-user.xml文件用文本编辑器打开,找到以下标签便是管理员帐号和密码了 //角色 //用户名和密码如果tomcat-users标签里为空值或者全是注释,可以自己按上面的格式
在此记录下Nginx服务器nginx.conf的配置文件说明, 部分注释收集与网络. #使用的用户和组(可以只设置用户而已) user www-data www-data; #启动进程,通常设置成和cpu的数量相等(一般等于CPU的总核数或者总核数的两倍),每个进程耗费10...
添加最少的字符让字符串变为回文字符串(1)题目描述给定一个字符串str,如果可以在str的任意位置添加字符,请返回在添加字符最少的情况下,让str整体都是回文字符串的一种结果。输入描述:输入包含一行字符串,代表str(1≤lengthstr≤5000)str(1 \leq length_{str} \leq 5000)str(1≤lengthstr≤5000)。输出描述:输出一行,代表返回的字符串。示例1输入ABA输出ABA示例2输入AB输出ABA备注:时间复杂
1. 在终端下: 复制命令:Ctrl + Shift + C 组合键. 粘贴命令:Ctrl + Shift + V 组合键. 2. 在控制台下: 复制命令:Ctrl + Insert 组合键 或 用鼠标选中即是复制。 粘贴命令:Shift + Insert 组合键 或 单击鼠标滚轮即为
标签,添加段落语法:段落文本标签,为你的网页添加标题标题标签一共有6个,h1、h2、h3、h4、h5、h6分别为一级标题、二级标题、三级标题、四级标题、五级标题、六级标题。并且依据重要性递减。是最高的等级。加入强调语气,使用和标签语法:需要强调的文本 需要强调的文本默认em是斜体,strong是加粗,可以用css改变
# -*- coding: utf-8 -*-import osimport sysimport timeimport unittestfrom appium import webdriver# from selenium import webdriverfrom HTMLTestRunner import HTMLTestRunnerfrom appium.webdriver.co...
你好,“程序停止正常工作。请关闭该程序。”这样的Windows 错误提示弹窗是由微软设计以提醒并帮助解决用户程序及系统问题。如果需要禁止这样的错误报告,可以通过更改本地组策略来实现。步骤如下所示:1.以管理员身份运行gpedit.msc2.计算机配置->管理模板->Windows 组件->Windows 错误报告3.在“禁用Windows 错误报告”上右击,选编辑,从未配置或者已...
前言昨天讲了DarkNet的底层数据结构,并且将网络配置文件进行了解析存放到了一个network结构体中,那么今天我们就要来看一下Darknet是如何加载数据进行训练的。加载训练数据DarkNet的数据加载函数load_data()在src/data.c中实现(src/detector.c函数中的train_detector直接调用这个函数加载数据)。load_data()函数调用流程如下:...
<li> <a href=' http://xin.lingyanghuodong.com/uploads/200924/1-200924102G6157.png' target='_blank'><img src=' http://xin.lingyanghuodong.com/uploads/200924/1-200924102G6157.png' width='651' border='0'/></a> ...
IAR主函数中没有循环,程序运行到结尾退出了。
在用vue-cli脚手架初始化项目时npm run dev 运行后报错说localhost打不开:Error: listen EADDRNOTAVAIL: address not available 175.8.167.49:8080 at Server.setupListenHandle [as _listen2] (net.js:1253:19) at listenInCl...
一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子: 1). 并行设备的硬件寄存器(如:状态寄存器) 2). 一个中断服务子程序中会访问到的非自动变量(Non-automatic v...