leetcode 79 单词搜索
一、题目描述
二、解题思路
整体思路
首先找到入口(字符串的第一个字符),再从入口开始进行搜索,可以采用回溯+剪枝的方法来解决这个问题。
具体思路
(1)函数功能:dfs函数用于从board[i][j]开始搜索从word[pos]开始的匹配的字符串,如果可以找到,就返回true,如果找不到,就返回false;
(2)递归出口:当pos==word.size()时,表示字符串已经在board找到了,返回true;
(3)函数体:以board[i][j]为起点,向上、右、下、左探索,判断其值是否等于word[pos](考虑是否越界,新探索的位置是否被拜访过),以此类推,直到探索到尽头;
注意:观察点(i,j)上(i,j+1)、右(i+1;j)、下(i,j-1)、左(i-1,j)点的坐标规律,可以用dx数组和dy数组来实现上、右、下、左探索;
<1>循环从0到3,对(i,j)位置按上、右、下、左的方式进行探索,如果(x,y)没有越界且未被拜访且board[x][y]==word[pos],就将visited[x][y]赋值为true,再dfs处理pos+1位置;
<2>如果dfs(board,i,j,pos+1,word)==true,存在题目需要的情况,直接返回true;
<3>如果没有找到,就回溯恢复现场;
<4>若以(i,j)为起点的所有路径都已经搜索完且未找到题目需要的情况,就返回false;
三、代码实现
class Solution {int m;int n;vector<vector<bool>>visited;
public:bool exist(vector<vector<char>>& board, string word) {m=board.size();n=board[0].size();visited.resize(m,vector<bool>(n,false));//寻找出口for(int i=0;i!=m;i++)for(int j=0;j!=n;j++){if(board[i][j]==word[0]){visited[i][j]=true;if(dfs(board,i,j,1,word)) return true;visited[i][j]=false;}}return false;}int dx[4]={0,1,0,-1};int dy[4]={1,0,-1,0};bool dfs(vector<vector<char>>& board,int i,int j,int pos,string word){//递归出口if(pos==word.size()) return true;for(int k=0;k!=4;k++){int x=i+dx[k];int y=j+dy[k];if(x>=0&&x<m&&y>=0&&y<n&&!visited[x][y]&&board[x][y]==word[pos]){visited[x][y]=true;if(dfs(board,x,y,pos+1,word)) return true;//恢复现场visited[x][y]=false;}}return false;}
};