您的位置:首页 > 其它

LeetCode-79. Word Search

2017-07-01 09:57 357 查看

题目描述

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

解题思路

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

代码

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;i<board.length;i++){
for(int j=0;j<board[0].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+1<board.length && !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(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+1<board[0].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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: