剑指offer_12_矩阵中的路径
请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。例如,在下面的3×4的矩阵中包含一条字符串“bfce”的路径(路径中的字母用加粗标出)。
[[“a”,“b”,“c”,“e”],
[“s”,“f”,“c”,“s”],
[“a”,“d”,“e”,“e”]]
但矩阵中不包含字符串“abfb”的路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入这个格子。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/ju-zhen-zhong-de-lu-jing-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
写上我只击败6%的笨笨递归方法,但感觉答案也差不多,都是DFS+剪枝
class Solution {
int m;
int n;
public boolean exist(char[][] board, String word) {
if(word.length()==0){
return true;
}
this.m = board.length;
this.n = board[0].length;
if(m*n<word.length()){
return false;
}
boolean[][] flag = new boolean[m][n];
for(int i=0;i<m;i++){
Arrays.fill(flag[i],true);//为真代表该节点可以走
}
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
//println(board[i][j]);
if(word.charAt(0)==board[i][j]){
if(go(board,word,0,i,j,flag)){
//成功则代表可以返回true
return true;
}
//失败则寻找下一个合适的开始点,并刷新flag
for(int z=0;z<m;z++){
Arrays.fill(flag[z],true);//为真代表该节点可以走
}
}
}
}
return false;
}
public boolean go(char[][] board,String word,int start,int x,int y,boolean[][] flag){
if(start == word.length()-1){
//成功到达终点
return true;
}else{
flag[x][y] = false;//将当前节点标为已走过
/*
boolean up = false;
boolean down = false;
boolean left = false;
boolean right = false;
*/
//寻找下一个方向
//首先尝试向上,需要数组未越界,且上方flag为true,且word[start+1]=board[x-1][y]
if(x-1>=0&&flag[x-1][y]&&word.charAt(start+1)==board[x-1][y]){
if( go(board,word,start+1,x-1,y,flag)){
return true;
}
}
//其次尝试向下,需要数组未越界,且下方flag为true,且word[start+1]=board[x+1][y]
if(x+1<m&&flag[x+1][y]&&word.charAt(start+1)==board[x+1][y]){
if(go(board,word,start+1,x+1,y,flag)){
return true;
}
}
//向左
if(y-1>=0&&flag[x][y-1]&&word.charAt(start+1)==board[x][y-1]){
if(go(board,word,start+1,x,y-1,flag)){
return true;
}
}
//向右
if(y+1<n&&flag[x][y+1]&&word.charAt(start+1)==board[x][y+1]){
if(go(board,word,start+1,x,y+1,flag)){
return true;
}
}
//因为此路走不通,所以不走此节点,所以将此节点标为true,供别的路径走
flag[x][y] = true;
return false;
}
}
}
本文介绍了一个算法问题:在矩阵中寻找特定字符串的路径。通过深度优先搜索(DFS)结合剪枝策略实现,确保路径唯一性和有效性。
324

被折叠的 条评论
为什么被折叠?



