赞
踩
剑指 Offer 12. 矩阵中的路径 - 力扣(LeetCode)
定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
例如,在下面的 3×4 的矩阵中包含单词 "ABCCED"(单词中的字母已标出)。
思路:采用记忆化搜索与回溯相结合的思想来做,在回溯的过程中利用一个二维数组来记录当前已经走过的路防止重复走,而回溯是用来枚举所有可能情况相对较好的一种思路。
- //采用记忆化搜索与回溯相结合的思想来做
- //在回溯的过程中利用一个二维数组来记录当前已经走过的路防止重复走
- //而回溯是用来枚举所有可能情况相对较好的一种思路
- class Solution {
- public:
- bool exist(vector<vector<char>>& board, string word) {
- int m=board.size(),n=board[0].size();
- for(int i=0;i<m;++i){
- for(int j=0;j<n;++j){
- if(board[i][j]==word[0]){//如果首字母相同,执行检查函数
- vector<vector<bool>> check(m,vector<bool>(n,false));
- check[i][j]=true;
- if(check_way(board,i,j,word,1,check))return true;
- }
- }
- }
- return false;
- }
- private:
- bool check_way(vector<vector<char>>& board,int i,int j,string& str,int num,
- vector<vector<bool>>& check){
- if(num==str.size())return true;
- if(i>0&&!check[i-1][j]&&(board[i-1][j]==str[num])){
- check[i-1][j]=true;
- if(check_way(board,i-1,j,str,num+1,check))return true;
- else check[i-1][j]=false;//回溯,也即如果这个位置不成立则恢复至检查前的状态
- }
- if(i<board.size()-1&&!check[i+1][j]&&(board[i+1][j]==str[num])){
- check[i+1][j]=true;
- if(check_way(board,i+1,j,str,num+1,check))return true;
- else check[i+1][j]=false;
- }
- if(j>0&&!check[i][j-1]&&(board[i][j-1]==str[num])){
- check[i][j-1]=true;
- if(check_way(board,i,j-1,str,num+1,check))return true;
- else check[i][j-1]=false;
- }
- if(j<board[0].size()-1&&!check[i][j+1]&&(board[i][j+1]==str[num])){
- check[i][j+1]=true;
- if(check_way(board,i,j+1,str,num+1,check))return true;
- else check[i][j+1]=false;
- }
- return false;
- }
- };
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。