力扣刷题:单词搜索(C++实现)——记忆回溯方法

力扣刷题:单词搜索(C++实现)——记忆回溯方法_第1张图片

力扣刷题:单词搜索(C++实现)——记忆回溯方法_第2张图片 

 关于这类给定表格,查找单词问题,思路基本一致。每个各自有上下左右四个方向,向每个方向搜索的问题。具体代码如下所示。

class Solution {
public:
    bool exist(vector>& board, string word) {
    int n=board.size();
    int m=board[0].size();
    if(board.empty()||word.empty()){return false;} //当数组或者给定单词为空直接返回。
    vector>f(n,vector(m,0));  //创建一个数组记录board上对应位置是否被使用过,初始值为0,使用过标记为1
     for(int i=0;i>& board,string word,int index,int x,int y,vector>&f){
           //当搜索完整个单词,那么返回true.
          if(index==word.size()){
              return true;
          } 
         if(x<0||x>=board.size()||y<0||y>=board[0].size()||board[x][y]!=word[index]) return false; //如果有越界或者是当前位置不是要搜索的下一个字符,那么直接返回false.
         if(f[x][y]==0){  //当前位置是要搜索的字符,那么从这个位置开始搜索下一个字符
             f[x][y]=1;   //先将这个位置标记为使用过
             if(dfs(board,word,index+1,x+1,y,f)||dfs(board,word,index+1,x,y+1,f)||dfs(board,word,index+1,x-1,y,f)||dfs(board,word,index+1,x,y-1,f))
             {
                 return true;  //当前位置向四个方向有一个能够走完全程那么返回true
             } 
             f[x][y]=0;   //没有一个可以的证明从当前位置出发没有合适的单词,不能标记当前位置,因此复位。
         }
         return false;  
    }

};

你可能感兴趣的:(c++,算法,力扣,数据结构)