79. Word Search

    /*
     * 79. Word Search 
     * 2016-5-12 by Mingyang 
     * 这里的起点就是遍历所有的点,找出这个起点
     * 我自己做的时候,用了一个StringBuffer来进行加减,判断条件就是sb和word相等,但是!每次加减sb造成了时间上的浪费
     * 这里我们用一个index来就好了,每次完了以后,index+1.这样的话我们就可以通过index和word的长度来判断
     * 另外有一个技巧就是index不用自己加加,只用加1,这样不会改变index的本质,不用退回来再减一个了。
     * 1.长度标准:所有表格进行遍历,对每一个进行dfs,只要有一个可以就成功了
     * 2.可选的范围:没有可选范围,已经规定死了xy轴
     * 3.往前走一步:可以往上下左右四个方向分别加1
     * 4.后退一步:mark unvisited
     * 5.特别的case:出界了,访问过了,或者达标了
     * 6.关于重复:无
     * 这个题目自己在做的时候出了这么几个问题,第一个就是忽略掉了一个条件,就是board[rowindex][colindex] != word.charAt(index)
     * 另外一个就是忘了把visited改为false,因为开始设为true以后进入下一层,但是从下一层返回来以后无论结果是true还是false
     * 都应该把visited表还原,因为只有还原才能进行下一个位置的假设。
     */
    public boolean exist(char[][] board, String word) {
        int m = board.length;
        int n = board[0].length;
        boolean[][] visited = new boolean[m][n];
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (dfs4(board, word, 0, i, j, visited))
                    return true;
            }
        }
        return false;
    }
    public boolean dfs4(char[][] board, String word, int index, int rowindex,int colindex, boolean[][] visited) {
        if (index == word.length())
            return true;
        if (rowindex < 0 || colindex < 0 || rowindex >= board.length|| colindex >= board[0].length)
            return false;
        if (visited[rowindex][colindex])
            return false;
        if (board[rowindex][colindex] != word.charAt(index))
            return false;
        visited[rowindex][colindex] = true;
        boolean res = dfs4(board, word, index + 1, rowindex - 1, colindex,visited)
                || dfs4(board, word, index + 1, rowindex + 1, colindex, visited)
                || dfs4(board, word, index + 1, rowindex, colindex + 1, visited)
                || dfs4(board, word, index + 1, rowindex, colindex - 1, visited);
        visited[rowindex][colindex] = false;
        return res;
    }
原文地址:https://www.cnblogs.com/zmyvszk/p/5488269.html