矩阵中的路径——典型的DFS应用
剑指offer 12.矩阵中的路径
- 自己写的版本,用Map来做,无法通过全部用例,原因是面临多个选择只能走其中一条,无法走其他的。需要改进,在判断那里加递归。
class Solution {
public boolean exist(char[][] board, String word) {
int wid=board[0].length;
int height=board.length;
int len=word.length();
if(height*wid<len) return false;
Map<Integer, Character> map=new HashMap<Integer, Character>();
for(int i=1;i<=height;i++){
for(int j=1;j<=wid;j++){
int key=i*10+j;
char ch=board[i-1][j-1];
map.put(key,ch);
}
}
List<Integer> arr=new ArrayList<Integer>();
for(int i=0;i<height;i++){
for(int j=0;j<wid;j++){
char ch2=board[i][j];
if(ch2==word.charAt(0)){
int sum=(i+1)*10+j+1;
arr.add(sum);
}
}
}
boolean boo=false;
for(int i:arr){
boolean b=search(len,i,map,word);
if(b) {
boo=true;
break;
}
}
return boo;
}
public boolean search(int len,int ind,Map contain,String word){
Map<Integer, Character> contains=contain;
int ind2=ind;
int i=1;
while(i<len){
char ch3=word.charAt(i);
int left=ind2-1;
int right=ind2+1;
int down=ind2-10;
int up=ind2+10;
if(contains.containsKey(left)&&contains.get(left)==ch3) {
ind2=left;
i++;
contains.remove(ind2);
continue;
}
if(contains.containsKey(right)&&contains.get(right)==ch3) {
ind2=right;
i++;
contains.remove(ind2);
continue;
}
if(contains.containsKey(up)&&contains.get(up)==ch3) {
ind2=up;
i++;
contains.remove(ind2);
continue;
}
if(contains.containsKey(down)&&contains.get(down)==ch3) {
ind2=down;
i++;
contains.remove(ind2);
continue;
}
return false;
}
return true;
}
}
- 看了题解后再写的辣鸡版本
class Solution {
int height,wid;
int[][] dis=new int[][]{{-1,0},{1,0},{0,-1},{0,1}};
public boolean exist(char[][] board, String word) {
height=board.length;
wid=board[0].length;
for(int i=0;i<height;i++){
for(int j=0;j<wid;j++){
if(board[i][j]==word.charAt(0)){
board[i][j]='/';
if(dfs(board,i,j,1,word)) return true;
board[i][j]=word.charAt(0);
}
}
}
return false;
}
public boolean dfs(char[][] board,int row,int column,int indx,String word){
if(indx==word.length()){
return true;
}
for(int[] dir:dis){
int newrow=row+dir[0]; int newcol=column+dir[1];
if(0<=newrow&&newrow<height&&newcol>=0&&newcol<wid
&&board[newrow][newcol]==word.charAt(indx)){
board[newrow][newcol]='/';
if(dfs(board,newrow,newcol,indx+1,word)) return true;
board[newrow][newcol]=word.charAt(indx);
}
}
return false;
}
}
- 最简洁的题解
class Solution {
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;
}
boolean dfs(char[][] board, char[] word, int i, int j, int k) {
if(i >= board.length || i < 0 || j >= board[0].length || j < 0 ||
board[i][j] != word[k]) 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;
}
}

浙公网安备 33010602011771号