【题目描述】
给出一个二维字符数组和一个单词,判断单词是否在数组中出现,
单词由相邻单元格的字母连接而成,相邻单元指的是上下左右相邻。同一单元格的字母不能多次使用。
例如:
给出的字符数组=
[ [“XYZE”], [“SFZS”], [“XDEE”] ]
单词 =“XYZZED”, -> 返回 true,
单词 =“SEE”, ->返回 true,
单词 =“XYZY”, -> 返回 false.
【思路分析】
这种题一看就是要用DFS加递归来进行实现的。使用DFS,主要就是从各点开始往四个方向进行搜索,一旦找到一种正确解,即返回true。注意已经访问过的点不能再次访问,那么可以将访问过的点替换成特殊字符’.’,下次就不会与单词字母匹配。
【代码】
class Solution {
public:
bool search(vector<vector<char>>& board, string word, int i, int j, int pos) {
if (pos == word.size())
return true;
if (i < 0 || j < 0 || i >= board.size() || j >= board[i].size())
return false;
if (word[pos] != board[i][j])
return false;
char temp = board[i][j];
board[i][j] = '.';
bool result = search(board, word, i + 1, j, pos + 1) ||
search(board, word, i - 1, j, pos + 1) || search(board, word, i, j - 1, pos + 1) ||
search(board, word, i, j + 1, pos + 1);
board[i][j] = temp;
return result;
}
bool exist(vector<vector<char>>& board, string word) {
for (int i = 0; i < board.size(); i++) {
for (int j = 0; j < board[i].size(); j++) {
if (search(board, word, i, j, 0))
return true;
}
}
return false;
}
};
【题目链接:https://www.nowcoder.com/practice/14bcbcb7ae3c40c9bdbc5a0861361c29?tpId=46&&tqId=29099&rp=1&ru=/ta/classic-code&qru=/ta/classic-code/question-ranking】