LeetCode 79.单词搜索
给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
// 有“往回走”的情况就考虑回溯
class Solution {
public:
bool exist(vector<vector<char>>& board, string word) {
int m = board.size(),n = board[0].size();
int start_index = 0; // 字符串第i个元素
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
backtracking(board,word,m,n,0,i,j);
}
}
return target;
}
private:
bool target = false;
vector<char> path;
void backtracking(vector<vector<char>>& board, string word,int& m,int& n,int start_index,int i,int j) {
char tmp;
if(board[i][j] == word[start_index])
{
path.push_back(word[start_index]);
if(path.size() == word.length()) // 在每次传入新元素时首先判断path.size();
{
target = true;
return;
}
tmp = board[i][j];
board[i][j] = ' '; // 同一个单元格内的字母不允许被重复使用
if(i-1 >= 0)
backtracking(board,word,m,n,start_index+1,i-1,j);
if(i+1 < m)
backtracking(board,word,m,n,start_index+1,i+1,j);
if(j-1 >= 0)
backtracking(board,word,m,n,start_index+1,i,j-1);
if(j+1 < n)
backtracking(board,word,m,n,start_index+1,i,j+1);
board[i][j] = tmp;
path.pop_back();
}
else
return;
}
};