请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则之后不能再次进入这个格子。 例如
a b t g
c f c s
j d e h
这样的3 X 4 矩阵中包含一条字符串"bfce"的路径,但是矩阵中不包含"abfb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。
思路:
本题可使用回溯法解决。定义一个与矩阵等大小的布尔值矩阵用来判断是否已经进入过某点。定义栈来记录走过的路径。
public class Solution {
public boolean findway(Character[][] array,boolean[][] isfound,Stack<Integer> stack1,Stack<Integer> stack2,String str){
boolean res;
if (array==null||str==null)
return false;
for (int i = 0; i <array.length ; i++) {
for (int j = 0; j <array[0].length ; j++) {
if (str.charAt(0)==array[i][j]){
stack1.push(i);
stack2.push(j);
isfound[i][j]=true;
}
}
}
if (stack1.isEmpty()) return false;
res = backtracking(array,isfound,stack1,stack2,str);
return res;
}
public boolean backtracking(Character[][] array,boolean[][] isfound,Stack<Integer> stack1,Stack<Integer> stack2,String str){
boolean res = false;
int size = stack1.size();
//if (size==str.length()) return true;
int i = stack1.peek();
int j = stack2.peek();
//结束条件
if (size==str.length()) {
return true;}
char achar= str.charAt(size);
System.out.println("目前坐标:"+i+j+"目标字符"+achar+"目前栈尺寸"+size+"字符串长度"+str.length());
//向上找
if (i>0&&!isfound[i-1][j]&&array[i-1][j]==achar){
stack1.push(i-1);
stack2.push(j);
isfound[i-1][j]=true;
res = backtracking(array,isfound,stack1,stack2,str);
if (!res){
stack1.pop();
stack2.pop();
isfound[i-1][j] = false;
}
}
//向下找
if (i<array.length-1&&!isfound[i+1][j]&&array[i+1][j]==achar){
stack1.push(i+1);
stack2.push(j);
isfound[i+1][j]=true;
res = backtracking(array,isfound,stack1,stack2,str);
if (!res){
stack1.pop();
stack2.pop();
isfound[i+1][j] = false;
}
}
//向左找
if (j>0&&!isfound[i][j-1]&&array[i][j-1]==achar){
stack1.push(i);
stack2.push(j-1);
isfound[i][j-1]=true;
res = backtracking(array,isfound,stack1,stack2,str);
if (!res){
stack1.pop();
stack2.pop();
isfound[i][j-1] = false;
}
}
//向右找
if (j<array[0].length-1&&!isfound[i][j+1]&&array[i][j+1]==achar){
stack1.push(i);
stack2.push(j+1);
isfound[i][j+1]=true;
res = backtracking(array,isfound,stack1,stack2,str);
if (!res){
stack1.pop();
stack2.pop();
isfound[i][j+1] = false;
}
}
return res;
}
}