方法一:回溯法
回溯法:
1.我们创建一个二维数组flag记录每个当前的word是否走过;
2.遍历二维数组board中的每个元素,通过回溯一步一步的查找;
3.回溯中需要对当前位置的上下左右进行遍历回溯;
4.如果最终我们的查找元素的步数和原来的单词长度相等则返回true。
class Solution {
public:
bool exist(vector<vector<char>>& board, string word) {
word_size = word.size();
rows = board.size();
cols = board[0].size();
int index = 0; //word开始查找的下标
vector<vector<int>> flag(rows, vector<int>(cols, 0) );
for(int row = 0;row < rows; row++)
{
for(int col = 0; col < cols ; col++)
{
if( board[row][col] == word[index] )
{
bool result = recursion(row, col, index, flag, board, word);
if(result == true)
return true;
}
}
}
return false;
}
private:
bool recursion(int row, int col, int index, vector<vector<int>> &flag, vector<vector<char>>& board, string &word)
{
//越界时返回false
if(row < 0 || row > rows -1 || col < 0 || col > cols -1 )
return false;
//如果当前的值和word中的索引匹配,并且flag =0 未曾访问过
else if( board[row][col] == word[index] && flag[row][col] == 0)
{
//如果此时的长度和输入的长度相等,表示找到,return true
if(index == word_size - 1)
return true;
//如果当前没有到末尾,则递归继续查找
else
{
flag[row][col] = 1; //标记一下当前位置找过了
//如果对当前位置的四周进行搜索,如果都没有找到的话则返回false,标志清0,返回false
if( ( recursion( row + 1 , col , index + 1, flag, board, word ) ||
recursion( row - 1 , col , index + 1, flag, board, word ) ||
recursion( row , col + 1 , index + 1, flag, board, word ) ||
recursion( row , col - 1 , index + 1, flag, board, word )
) == false)
{
flag[row][col] = 0;
return false;
}
else
{
return true;
}
}
}
else
{
return false;
}
}
int word_size;
int rows,cols;
};