问题描述
给定一个 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; //二维数组中不存在该单词
}
};