剑指 Offer 12. 矩阵中的路径

剑指 Offer 12. 矩阵中的路径

给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。

单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。

例如,在下面的 3×4 的矩阵中包含单词 "ABCCED"(单词中的字母已标出)。

 

示例 1:

输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED"
输出:true

示例 2:

输入:board = [["a","b"],["c","d"]], word = "abcd"
输出:false

提示:

  • 1 <= board.length <= 200
  • 1 <= board[i].length <= 200
  • board 和 word 仅由大小写英文字母组成
class Solution {
public:
    int vis[201][201] = {0};   
    int fz[4][2] = {0,1,0,-1,1,0,-1,0}; 
    int flag = 0;
    int n,m;
    void dfs(int x,int y,int len,string word,vector<vector<char>>& board){
        if(len == word.size()) flag = 1;
        if(flag == 1) return;
        for(int i = 0;i < 4;i++){
            int xx = x + fz[i][0];
            int yy = y + fz[i][1];
            if(xx >= 0 && xx < n && yy >= 0 && yy < m && word[len] == board[xx][yy] && vis[xx][yy] == 0){
                vis[xx][yy] = 1;
                dfs(xx,yy,len + 1,word,board);
                vis[xx][yy] = 0;
            }
        }
    }
    bool exist(vector<vector<char>>& board, string word) {
        n = board.size(),m = board[0].size();
        for(int i = 0;i < n;i++){
            for(int j = 0;j < m;j++){
                if(board[i][j] == word[0]){
                    vis[i][j] = 1;
                    dfs(i,j,1,word,board);
                    vis[i][j] = 0;
                }
            }
        }
        return flag == 1;

    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值