矩阵中的路径

问题描述

给定一个 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 仅由大小写英文字母组成

思想

①设置一个下标来标记下一步待比较元素的位置。②当前元素和带比较字符相匹配时,再看其四周是否有符合条件的位置。③当其四周没有匹配的字符时,回退元素比较下一个相邻的位置。

C++实现

class Solution {
public:
    int cols,rows,pathIndex; //pathIndex记录下一个待比较的字符下标
    bool visted[40000]; //用一维数组来标记二维数组中的元素
    vector<vector<char>> matrix;  //定义成员matrix以供递归函数使用
    string str;   //定义str来保存word,来减少递归函数的参数

    bool hasPathCore(int row,int col){ //参数是行下标和列下标
        if(pathIndex==str.size()){ //字符串已经匹配完成
            return true;
        }

        if(row<0||row>=rows||col<0||col>=cols
        ||visted[row*cols+col]==true
        ||matrix[row][col]!=str[pathIndex]){ //当数组越界或该位置的字符和字符串的下一位置不匹配
            return false;
        }

        visted[row*cols+col]=true;  //程序能走到这说明,该元素与字符串下一位置相匹配
        pathIndex++;  //递增至下一位置

        int hasPath=hasPathCore(row-1,col)||hasPathCore(row,col-1)
        ||hasPathCore(row+1,col)||hasPathCore(row,col+1);  //当有一条路能走通时,就会返回true,按顺序调用递归函数,相当于按顺序判断每一个方向

        if(!hasPath){ //当前字符虽然和字符串的下一位置相匹配,但后面的路走不通
            visted[row*cols+col]=false;  //二维数组中回退一个位置
            pathIndex--;    //待匹配字符串回退一个位置
            return false;  
        }

        return true;  //hasPath为真,存在这条路
    }
    bool exist(vector<vector<char>>& board, string word) {
        if(board.size()==0||word==""){  //输入无效的情况
            return false;
        }

        matrix=board;
        str=word,pathIndex=0;
        rows=board.size(),cols=board[0].size();  //对相关成员变量进行赋值
        for(int i=0;i<40000;i++){  //将二维数组中的所有元素标记为未访问状态
            visted[i]=false;
        }

        for(int i=0;i<rows;i++){
            for(int j=0;j<cols;j++){
                if(hasPathCore(i,j)){   //从二维数组中各个元素做为起始点,若找到就直接返回
                    return true;
                }
            }
        }

        return false; //二维数组中不存在该单词
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值