给定一个二维网格和一个单词,找出该单词是否存在于网格中。
Claim: 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
Example:
board =
[
['A','B','C','E'],
['S','F','C','S'],
['A','D','E','E']
]
给定 word = "ABCCED", 返回 true
给定 word = "SEE", 返回 true
给定 word = "ABCB", 返回 false
Thinking:
利用回溯算法的思想,对二维数组每一元素依次遍历,若找到某一满足要求的元素,则在该元素四周寻找符合要求的下一元素,若未找到则返回上一层,以此类推。
Code:
bool find_word(vector<vector<char>>& board, string word, int i, int j, int k)
{
if(board[i][j] != word[k]) //1.不相等
return false;
else if(k == word.size()-1) //2.相等且为最后一个
return true;
//3.相等,但还要继续回溯
char tmp = board[i][j];
board[i][j] = '^';
k++;
if(((j>0)&&(find_word(board, word, i, j-1, k))) ||
((i>0) && (find_word(board, word, i-1, j, k))) ||
((j<board[0].size()-1) && (find_word(board, word, i, j+1, k))) ||
((i<board.size()-1) && (find_word(board, word, i+1, j, k))))
return true;
board[i][j] = tmp;
return false;
}
bool exist(vector<vector<char>>& board, string word) {
int row = board.size();
int col = board[0].size();
for(int i = 0; i < row; i++)
for(int j = 0; j < col; j++)
{
if(find_word(board, word, i, j, 0))
return true;
}
return false;
}