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

 

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

class Solution {
public:
    bool exist(vector<vector<char>>& board, string word) {
    int n=board.size();
    int m=board[0].size();
    if(board.empty()||word.empty()){return false;} //当数组或者给定单词为空直接返回。
    vector<vector<int>>f(n,vector<int>(m,0));  //创建一个数组记录board上对应位置是否被使用过,初始值为0,使用过标记为1
     for(int i=0;i<n;i++)
     {
         for(int j=0;j<m;j++){
            if(dfs(board,word,0,i,j,f))
                 return true;
         }
     }
     return false;
    }

  bool dfs(vector<vector<char>>& board,string word,int index,int x,int y,vector<vector<int>>&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;  
    }

};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值