这道题看着简直是完全没思路,看了下发现是使用回溯的方法。
下面这里要注意,newi是旧的i加上新的偏移值!newj同理,并不是加自己,别昏头!

s是String类型的变量,要写成size()

下面是正确的代码:
class Solution {
    public boolean exist(char[][] board, String word) {
        //每一个节点都可能是开始的节点
        int h = board.length, w = board[0].length;
        //千万记住不能忘记写boolean类型的数组new出大小,默认值是false
        boolean[][] visited = new boolean[h][w];
        for(int i = 0; i < h; i++){
            for(int j = 0; j < w; j++){
        //有多次机会,所以不可以直接返回值,对了或者循环结束了才能返回
                boolean flag = check(board,word,visited,i , j, 0);
                if(flag)
                    return true;
            }
        }
        return false;
    }
    //传进来的k是已经查对的位数
    public boolean check(char[][] board,String s, boolean[][] visited,int i, int j,int k){
        //有两种特殊情况,一种是不等于说明不满足条件
        if(board[i][j] != s.charAt(k))
            return false;
        //另一种是此时也相等并且等于s的长度
        else if(k == s.length() - 1)
            return true;
        //开始回溯的部分,每个节点有上下左右四个方向
        int [][] directions = {{0, 1}, {1, 0}, {-1, 0}, {0, -1}};
        visited[i][j] = true;
        boolean result = false;
        for(int[] dic : directions){
            //按照上下左右的方式递增值
            int newi = dic[0] + i,newj  = dic[1] + j;
            if(newi>=0&&newi<visited.length&&newj>=0&&newj<visited[0].length&&!visited[newi][newj]){
                boolean flag = check(board,s,visited,newi,newj,k+1);
                if(flag){
                    result = true;
                    break;
                }
            }
        }
        //没找到就复原当前状态,所有节点都复原
        visited[i][j] = false;
        return result;
    } 


















