题目
思路及代码
DFS和回溯入手点:
1、主方法找到递归开始的第一个点,调用递归方法;
2、递归方法中首先进行边界条件和是否能符合题目要求(本题中为是否与字符串中的第k个字符相同),若均满足,则该位置可访问,改变该位置的标记;
3、判断是否到达结束条件,若否则按照规定的搜索方法进行下一个位置的查找;
4、若按照规定的查找方法搜索完均未满足题目要求,则重新改变该位置标记,进行回溯。
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param matrix char字符型二维数组
* @param word string字符串
* @return bool布尔型
*/
public boolean hasPath (char[][] matrix, String word) {
// write code here
int rows = matrix.length;
int cols = matrix[0].length;
boolean [][] flag = new boolean [rows][cols];
if(rows == 0 || cols ==0) return false;
// String[] s = word.toCharArray;
for(int i= 0;i< rows;i++){
for(int j =0;j< cols;j++){
if(matrix[i][j] == word.charAt(0)){
if( search(matrix,word,flag,rows,cols,i,j,0)) return true;
}
}
}
return false;
}
public boolean search(char[][] matrix,String word,boolean[][] flag,int rows,int cols,int i,int j,int k){
//先考虑边界值
if(i<0 || i>= rows || j<0 || j>= cols || matrix [i][j] != word.charAt(k) || flag[i][j] == true)
return false;
else{
if(k== word.length()-1) return true;
k++;
flag[i][j] = true;
if(search(matrix,word,flag,rows,cols,i-1,j,k) ||
search(matrix,word,flag,rows,cols,i+1,j,k) ||
search(matrix,word,flag,rows,cols,i,j-1,k) ||
search(matrix,word,flag,rows,cols,i,j+1,k)
)
return true;
flag[i][j] = false;
return false;
}
}
}