标签:newj return int 单词 vector 搜索 board visited LeetCode
给定一个m x n二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用
1. 回溯法
类似于岛屿搜索的二维矩阵搜索,要用一个二维数组标记遍历过的路径,然后就是遍历每一个位置,递归四个方向
递归的时候注意矩阵边界以及该位置是否探索过
class Solution {
public:
bool flag = false;
void check(vector<vector<char>>& board, vector<vector<int>>& visited, int i, int j, string& s, int k) {
if(flag) return;
if (board[i][j] != s[k]) return;//判断对应值相等
if (k == s.length() - 1){flag=1;return;}//到达边界
visited[i][j] = true; //记录足迹
vector<pair<int, int>> directions{{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
//做选择
for (const auto& dir: directions) {
int newi = i + dir.first, newj = j + dir.second;//递归四个方向
//越界条件
if (newi >= 0 && newi < board.size() && newj >= 0 && newj < board[0].size())
if (!visited[newi][newj]) //如果不在路径中
check(board, visited, newi, newj, s, k + 1);//递归下一位置
}
visited[i][j] = false;//撤销该位置选择
}
bool exist(vector<vector<char>>& board, string word) {
int h = board.size(), w = board[0].size();
vector<vector<int>> visited(h, vector<int>(w));//建立一个足迹表
//递归每一个位置
for (int i = 0; i < h; i++)
for (int j = 0; j < w; j++) {
if (flag) return true;//找到立马结束遍历
check(board, visited, i, j, word, 0);
}
return flag;
}
};
标签:newj,return,int,单词,vector,搜索,board,visited,LeetCode 来源: https://www.cnblogs.com/929code/p/16307808.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。