矩阵中的路径——典型的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;
    }
}
posted @ 2021-03-16 20:13  shaon111  阅读(27)  评论(0)    收藏  举报