class Solution {
public boolean exist(char[][] board, String word) {
int h=board.length,w=board[0].length;
boolean[][] visited=new boolean[h][w];
for(int i=0;i<h;i++)
for(int j=0;j<w;j++)
//将整个矩阵都遍历一遍,找到单词的可行的开头位置
{
boolean flag=check(board,visited,i,j,word,0);
if(flag)
{
return true;
//找到就终止
}
}
return false;
}
//找到单词头之后,进一步比对
public boolean check(char[][] board,boolean[][]visited,int i,int j,String s,int k)
//visited是一个足迹矩阵
{
if(board[i][j]!=s.charAt(k))
return false;
//如果单词目前所指的不符合,就返回F
else if(k==s.length()-1)
{
return true;
}
//到了最后一个,成功了
visited[i][j]=true;
int[][] directions={{0,1},{0,-1},{1,0},{-1,0}};
//在矩阵中寻找下一个字母的走法有四种
boolean result=false;
//设初值为F
for(int[] dir:directions)
{
int newi=i+dir[0],newj=j+dir[1];
if(newi>=0&&newi<board.length&&newj>=0&&newj<board[0].length)
{
if(!visited[newi][newj])
//如果没被访问到
{
boolean flag=check(board,visited,newi,newj,s,k+1);
//那么检查下一个字母是否符合要求
if(flag)
{
result=true;
break;
}
}
}
}
visited[i][j]=false;
//如果最后还是没有一种递归情况符合,就将这一步轨迹消去,再做选择;或者是最后一步,是否设为0无所谓;总之目的是为了情况一
return result;
}
}
leetcode 单词检索 小米笔试题
最新推荐文章于 2024-04-29 09:07:41 发布