题目:
解答:
思路:
本问题是典型的矩阵搜索问题,可使用 深度优先搜索(DFS)+ 剪枝 解决。
- 深度优先搜索: 可以理解为暴力法遍历矩阵中所有字符串可能性。DFS 通过递归,先朝一个方向搜到底,再回溯至上个节点,沿另一个方向搜索,以此类推。
- 剪枝: 在搜索中,遇到 这条路不可能和目标字符串匹配成功 的情况(例如:此矩阵元素和目标字符不同、此元素已被访问),则应立即返回,称之为 可行性剪枝 。
代码:
class Solution {
public boolean exist(char[][] board, String word) {
char[] src=word.toCharArray();
for(int i=0;i<board.length;i++){
for(int j=0;j<board[0].length;j++){
if(find(board,src,i,j,0))
return true;
}
}
return false;
}
public boolean find(char[][] board,char[] src,int i,int j,int k){
if(i<0||j<0||i>=board.length||j>=board[0].length||board[i][j]!=src[k])
return false;
if(k==src.length-1)
return true;
board[i][j]='\0';
boolean temp=find(board,src,i+1,j,k+1)||find(board,src,i-1,j,k+1)||
find(board,src,i,j+1,k+1)||find(board,src,i,j-1,k+1);
board[i][j]=src[k];
return temp;
}
}