LeetCode-79. Word Search

题目描述

给定一个二维字符矩阵和一个单词,判定该矩阵中地临近地字符能否组成这个单词。要求:临近地意思是指两字符只能水平临近或者竖直临近;每个位置地字符只能使用一次。

解题思路

使用回溯算法,采用递归实现,需要判定边界条件,需要一个数组记录走过地位置。

代码

public class Solution {
    private boolean[][] flags;
    public boolean exist(char[][] board, String word) {
        if(board==null || board.length==0 || word==null)
            return false;
        if(board[0].length==0 || word.length()==0)
            return true;
        flags=new boolean[board.length][board[0].length];
        for(int i=0;ifor(int j=0;j0].length;j++){
                flags[i][j]=true;
                if(existCore(board, word, 0, i, j))
                    return true;
                flags[i][j]=false;
            }
        }
       return false;
    }
    private boolean existCore(char[][] board,String word,int point,int i,int j){
        if(board[i][j]==word.charAt(point)){
            if(point==word.length()-1)
                return true;

            if(i-1>=0 && !flags[i-1][j]){
                flags[i-1][j]=true;
                if(existCore(board,word,point+1,i-1,j))
                    return true;
                flags[i-1][j]=false;
            }

            if(i+11][j]){
                flags[i+1][j]=true;
                if(existCore(board,word,point+1,i+1,j))
                    return true;
                flags[i+1][j]=false;
            }

            if(j-1>=0 && !flags[i][j-1]){
                flags[i][j-1]=true;
                if(existCore(board,word,point+1,i,j-1))
                    return true;
                flags[i][j-1]=false;
            }
            if(j+10].length && !flags[i][j+1]){
                flags[i][j+1]=true;
                if(existCore(board,word,point+1,i,j+1))
                    return true;
                flags[i][j+1]=false;
            }
            return false;
        }
        return false;
    }
}

你可能感兴趣的:(LeetCode刷题)