leetcode(79)- 单词搜索

79.单词搜索
给定一个二维网格和一个单词,找出该单词是否存在于网格中。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
示例:
board =
[
[‘A’,‘B’,‘C’,‘E’],
[‘S’,‘F’,‘C’,‘S’],
[‘A’,‘D’,‘E’,‘E’]
]
给定 word = “ABCCED”, 返回 true
给定 word = “SEE”, 返回 true
给定 word = “ABCB”, 返回 false
提示:
board 和 word 中只包含大写和小写英文字母。
1 <= board.length <= 200
1 <= board[i].length <= 200
1 <= word.length <= 10^3

思路

这题目比较简单,之前写了很多dfs的题目了,这一看就是套模板的题目。

void dfs(int step)
{
        if(满足终止搜索条件)
        {
            终止搜索,记录数据;
            return;
        }
        
        尝试每一种搜索可能
        {
               if(不满足继续搜索的条件)
               {
					跳过这一种搜索可能;
			   }
			   
			   记录搜索数据;
               继续下一步dfs(step+1);
               恢复初始状态(回溯的时候要用到);
        }
}   

对应的实现代码

class Solution {
	boolean res = false;
    public boolean exist(char[][] board, String word) {
    	for(int i = 0; i < board.length; i++)
    	{
    		for(int j = 0; j < board[0].length; j++)
    		{
    			if(board[i][j] == word.charAt(0))
    			{
    				
    				dfs(-1,board,i,j,0,word);
    				if(this.res == true)
    				{
    					return true;
    				}
    			}
    		}
    	}
    	
    	return false;
    }
    
    void dfs(int flag,char[][] board,int i,int j,int indexOfWord,String word)
    {
    		/*满足终止搜索条件*/
            if(indexOfWord > word.length() - 1 || this.res == true)
            {
                this.res = true;//终止搜索记录数据
                return;
            }
            
            //尝试各种情况
            for(int k = 0; k < 4; k++)//上下左右
            {
                   //不满足搜索条件
                   if(flag == k || i < 0 || i >= board.length || j < 0 || j >= board[0].length)
                   {
    					continue;
    			   }
                   //不满足搜索条件
                   if(word.charAt(indexOfWord) != board[i][j])
                   {
                	   continue;
                   }
                   //记录数据
                   char temp = board[i][j];
                   board[i][j] = '?';//这里是为了不重复使用同一个位置的字节
                   indexOfWord++;
                   //下一步dfs
                   switch (k)
                   {
                   case 0:
                	   dfs(1,board,i,j - 1,indexOfWord,word);
                	   break;
                   case 1:
                	   dfs(0,board,i,j + 1,indexOfWord,word);
                	   break;
                   case 2:
                	   dfs(3,board,i - 1,j,indexOfWord,word);
                	   break;
                   case 3:
                	   dfs(2,board,i + 1,j,indexOfWord,word);
                	   break;
                   }
                   //恢复状态,回溯
                   board[i][j] = temp;
                   indexOfWord--;
            }
    }   

}
发布了81 篇原创文章 · 获赞 21 · 访问量 8808

猜你喜欢

转载自blog.csdn.net/qq_37668436/article/details/105222013