题目链接:https://leetcode.cn/problems/ju-zhen-zhong-de-lu-jing-lcof/
image.png
题目解析
本题采用暴力解析,采用遍历的方式, 从 (i,j)位置开始进行对比第一个字符,如果当前位置满足,在继续邻边匹配下一个字符,直到匹配到最后一个字符。需要注意的是需要标记一下之前的匹配位置,不然造成重复匹配。
专业术语: 深度优先搜索(DFS)+ 剪枝
public boolean exist(char[][] board, String word) {
char [] words = word.toCharArray();
for (int i = 0; i < board.length; i++) {
for (int j = 0; j < board[0].length; j++) {
if (dfs(board,words,i,j,0)){
return true;
}
}
}
return false;
}
private boolean dfs(char[][] board, char[] word,int i,int j,int k){
if (i >= board.length || i<0 || j>=board[0].length || j<0 || word[k]!=board[i][j]){
return false;
}
if (k == word.length-1) return true;
board[i][j] = '\0';
boolean res = dfs(board,word,i+1,j,k+1) || dfs(board,word,i-1,j,k+1)
|| dfs(board,word,i,j+1,k+1) || dfs(board,word,i,j-1,k+1);
board[i][j] = word[k];
return res;
}
复杂度分析
M,N 分别为矩阵行列大小, K 为字符串 word 长度。
空间复杂度: O(K):递归最大深度为 K。
时间复杂度: O(3kMN):MN是 board 的遍历次数,3k是每一次遍历有 3 种可能,需要遍历K次。
网友评论