2 Star 0 Fork 0

Mr.Z / bigsai-algorithm

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
LeetCode 79单词搜索.md 2.18 KB
一键复制 编辑 原始数据 按行查看 历史
张赛 提交于 2020-12-06 21:43 . update

LeetCode 79单词搜索

给定一个二维网格和一个单词,找出该单词是否存在于网格中。

单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。

示例:

board =
[
  ['A','B','C','E'],
  ['S','F','C','S'],
  ['A','D','E','E']
]

给定 word = "ABCCED", 返回 true
给定 word = "SEE", 返回 true
给定 word = "ABCB", 返回 false

提示:

board 和 word 中只包含大写和小写英文字母。
1 <= board.length <= 200
1 <= board[i].length <= 200
1 <= word.length <= 10^3

分析 经典迷宫搜索题,这里我用dfs实现,对于迷宫搜索题需要注意以下几点:

  • 定义四个方向数组,用来坐标模拟行走
  • 走过的坐标需要临时标记(回溯),回来的时候在清除标记
  • 注意起始和结尾情况,尽量避免使用String频繁创建新的对象

而本题在搜索途中判断当前字符没有被使用且和目标位置字符相等即可模拟遍历。有一个注意的是一旦找到答案则不需要再进行搜索(需要停止)。

具体代码为:

int x[]= {-1,0,1,0};
int y[]= {0,-1,0,1};
boolean isvalue=false;
boolean jud[][];
public boolean exist(char[][] board, String word) {
	jud=new boolean[board.length][board[0].length];
	if(word.length()>board.length*board[0].length)return false;
	char words[]=word.toCharArray();
	for(int i=0;i<board.length;i++)
	{
		for(int j=0;j<board[i].length;j++)
		{
			jud[i][j]=true;
			if(words[0]==board[i][j])
			  dfs(board, 1, words, i, j);
			jud[i][j]=false;
			if(isvalue)return true;
		}
	}	
	return false;
   }
private void dfs(char[][] board,int index, char words[],int x1,int y1) {
	// TODO Auto-generated method stub
	if(isvalue)return;
	if(index==words.length)
	{
		isvalue=true;
	}
	else 
	{
		for(int i=0;i<4;i++)
		{
			int xnew=x1+x[i],ynew=y1+y[i];
			if(xnew>=0&&xnew<board.length&&ynew>=0&&ynew<board[0].length)
			{
				if(!jud[xnew][ynew]&&words[index]==board[xnew][ynew])
				{
					jud[xnew][ynew]=true;
					dfs(board, index+1, words, xnew, ynew);
					jud[xnew][ynew]=false;
				}
			}
		}
	}
}
Java
1
https://gitee.com/sillycoder/bigsai-algorithm.git
git@gitee.com:sillycoder/bigsai-algorithm.git
sillycoder
bigsai-algorithm
bigsai-algorithm
master

搜索帮助