题目
https://leetcode-cn.com/problems/word-search/
分析
dfs
代码
class Solution {
char[] words;
char[][] board;
int[][] visited;
int m,n;
public boolean exist(char[][] board, String word) {
if(board==null||board.length==0||word==null||word.equals(""))
return false;
words=word.toCharArray();
this.board=board;
m=board.length;
n=board[0].length;
visited=new int[m][n];
for(int i=0;i<m;i++)
Arrays.fill(visited[i],0);
boolean res=false;
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
res=dfs(i,j,0);
if(res==true)
return true;
}
}
return res;
}
public boolean dfs(int x,int y,int index){
if(index==words.length)//找到结果,返回true
return true;
if(x<0||y<0||x>=m||y>=n)//越界,返回false
return false;
if(board[x][y]!=words[index])//不是想要的值,返回false
return false;
if(visited[x][y]==1)//已访问过,返回false
return false;
boolean res=false;
visited[x][y]=1;//标记为已访问过
//遍历上下左右
res=dfs(x-1,y,index+1)||dfs(x+1,y,index+1)||dfs(x,y-1,index+1)||dfs(x,y+1,index+1);
if(res==true){
return true;
}
visited[x][y]=0;//重置标记,回溯
return res;
}
}
复杂度
时间复杂度:
空间复杂度:O(MN)
char数组和visited数组都占用MN的空间。同时栈的深度最大为 O(min(L,MN))。