leetcode:word search +word searchII总结
①word search:给定一个m x n的矩阵A
[
['A','B','C','E'],['S','F','C','S'],
['A','D','E','E']
],同时给定一个单词,例如word = "ABCCED", 在矩阵中任意连续不重复走动,若可以找到word对应的单词则返回true,否则返回false.主要的思路就是采用递归,对于矩阵中的每一个点,在A[i][j] ==word[k]的情况下,再次调用函数本身检测上下左右的点是不是和word[k+1]相等。这里有一个特别要注意的就是检测一个点的上下左右的情况会造成字母的重复使用,为了防止这种情况,在检查之前,要先将word[k]变成invalid。
class Solution {
public boolean check(char[][] board,String word,int index,int i,int j)
{
boolean flag = false;
if(word.length()==index)
return true;
if(i>=0&&i<board.length&&j>=0&&j<board[0].length&&word.charAt(index) == board[i][j])
{
board[i][j] ='*';
flag= check(board,word,index+1,i-1,j)||
check(board,word,index+1,i+1,j)||
check(board,word,index+1,i,j-1)||
check(board,word,index+1,i,j+1);
board[i][j] = word.charAt(index);
}
return flag;
}
public boolean exist(char[][] board, String word) {
if(board.length ==0)
return false;
for(int i=0;i<board.length;i++)
for(int j=0;j<board[0].length;j++)
{
if(check(board,word,0,i,j))
return true;
}
return false;
}
}
②word searchII:是word search的进阶版,给定的是一个words数组,对数组中的每一个字符串进行查找,返回可以在矩阵中找到的所有的字符串。应用word search的思路,对每一个字符串进行循环比对,可以AC(我就是这么做的),但是速度比较慢,因为对于像“BOY”和"BOARD"这样的单词,他们有相同前缀,对每一个单词按照word search的方式去比对,会造成一些没有必要的重复的工作。
看了一个人的思路:他对给定的words数组建立了一个搜索树,对有相同前缀的字符串,可以避免重复的工作,具体的对于树中元素的检查工作还是与word search的思路大体相似,word search在递归到word末尾时停止,word searchII在递归到搜索树的叶子节点之后停止。
代码链接:https://leetcode.com/problems/word-search-ii/discuss/59780/Java-15ms-Easiest-Solution-(100.00)