给定一个二维网格和一个单词,找出该单词是否存在于网格中。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
示例:
board =
[
['A','B','C','E'],
['S','F','C','S'],
['A','D','E','E']
]
给定 word = "ABCCED", 返回 true.
给定 word = "SEE", 返回 true.
给定 word = "ABCB", 返回 false.
一、思路
(一)深度优先搜索
根据题目要求,上下相邻或者左右相邻的字母都能使用,也是说有多条“路”可供选择,且,在这些“路”中,只要有一条“路”可以走通,就表示能够匹配,显然这是一个深度优先搜索问题
C++代码:
class Solution {
public:
bool exist(vector<vector<char>>& board, string word) {
if (word.empty())
return true;
if (board.empty() || board[0].empty())
return false;
bool ans;
vector<vector<bool>> use(board.size(), vector<bool>(board[0].size(), true));
// 找到dfs的起点
for (int i = 0; i < board.size(); i++)
for (int j = 0; j < board[0].size(); j++)
if (board[i][j] == word[0]) {
use[i][j] = false;
ans = dfs(board, word, i, j, 1, use);
if (ans)
return ans;
use[i][j] = true;
}
return ans;
}
bool dfs(vector<vector<char>>& board, string word, int pos_i, int pos_j, int pos, vector<vector<bool>>& use) {
if (pos == word.size())
return true;
bool ans = false;
if (!ans && pos_i + 1 < board.size() && board[pos_i + 1][pos_j] == word[pos] && use[pos_i + 1][pos_j]) {
use[pos_i + 1][pos_j] = false;
ans = dfs(board, word, pos_i + 1, pos_j, pos + 1, use);
use[pos_i + 1][pos_j] = true;
}
if (!ans && pos_i - 1 >= 0 && board[pos_i - 1][pos_j] == word[pos] && use[pos_i - 1][pos_j]) {
use[pos_i - 1][pos_j] = false;
ans = dfs(board, word, pos_i - 1, pos_j, pos + 1, use);
use[pos_i - 1][pos_j] = true;
}
if (!ans && pos_j + 1 < board[0].size() && board[pos_i][pos_j + 1] == word[pos] && use[pos_i][pos_j + 1]) {
use[pos_i][pos_j + 1] = false;
ans = dfs(board, word, pos_i, pos_j + 1, pos + 1, use);
use[pos_i][pos_j + 1] = true;
}
if (!ans && pos_j - 1 < board[0].size() && board[pos_i][pos_j - 1] == word[pos] && use[pos_i][pos_j - 1]) {
use[pos_i][pos_j - 1] = false;
ans = dfs(board, word, pos_i, pos_j - 1, pos + 1, use);
use[pos_i][pos_j - 1] = true;
}
return ans;
}
};
执行效率: