day65—回溯—单词搜索(LeetCode-79)
题目描述
给定一个 m x n
二维字符网格 board
和一个字符串单词 word
。如果 word
存在于网格中,返回 true
;否则,返回 false
。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
示例 1:
输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED" 输出:true
示例 2:
输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "SEE" 输出:true
示例 3:
输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCB" 输出:false
提示:
m == board.length
n = board[i].length
1 <= m, n <= 6
1 <= word.length <= 15
board
和word
仅由大小写英文字母组成
解决方案:
1、越界检查
2、终止条件:字符符合,字符串长度达到,该位置已遍历
3、单层循环逻辑:pos + 1,上下左右四方向判断
函数源码:
class Solution { public:bool exist(vector<vector<char>>& board, string word) {if(board.empty()) return false;int m=board.size(),n=board[0].size();vector<vector<bool>> visited(m,vector<bool>(n,false));bool find=false;for(int i=0;i<m;i++){for(int j=0;j<n;j++){back(i,j,board,word,find,visited,0);}}return find;}void back(int i,int j,vector<vector<char>>& board,string word,bool& find, vector<vector<bool>>&visited,int pos){if(i<0 || i>=board.size() || j<0 || j>=board[0].size()) return;if(visited[i][j] || find || board[i][j] != word[pos]) return;if(pos == word.size()-1){find=true;return;}visited[i][j]=true; //已遍历back(i+1,j,board,word,find,visited,pos+1);back(i-1,j,board,word,find,visited,pos+1);back(i,j-1,board,word,find,visited,pos+1);back(i,j+1,board,word,find,visited,pos+1);visited[i][j] = false;}};