给定一个二维网格和一个单词,找出该单词是否存在于网格中。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
解题思路: 看到类似这种方格里面搜索的题,基本上想到的是用图的遍历解决,这里用DFS解题。思路不难,这里说一个我在做这题出现的一个问题。本题有一个很大的测试case,我提交代码后TLE了,然后查看了一下网友Grandyang的解法,我的解法与他的解法差不多,而且看网上其他的解法大同小异,说明算法的时间复杂度是达到题目要求的,尽管此题采用的解法近似brute force,最后发现visited数组没有引用传递导致拷贝开销过大,时间超时,当然这仅仅是一个猜测。不过对于那些编程老手们,一般情况下传递很大的数组时,都会选用引用传递,避免大的拷贝开销,我这里出错的原因应该是编程太少了。请看代码。
class Solution {
public:
bool helper(vector<vector<char>>& board, int r, int c, int cur, string word, vector<vector<bool>> &visited) {
if (cur >= word.size()) return true;
int rows = board.size(), cols = board[0].size();
if (r < 0 || r >= rows || c < 0 || c >= cols || visited[r][c] == true || board[r][c] != word[cur]) return false;
visited[r][c] = true;
bool res = helper(board, r + 1, c, cur + 1, word, visited) ||
helper(board, r - 1, c, cur + 1, word, visited) ||
helper(board, r, c + 1, cur + 1, word, visited) ||
helper(board, r, c - 1, cur + 1, word, visited);
visited[r][c] = false;
return res;
}
bool exist(vector<vector<char>>& board, string word) {
int rows = board.size(), cols = board[0].size();
vector<vector<bool>> visited(rows, vector<bool>(cols, false));
for (int i = 0; i < rows; ++i) {
for (int j = 0; j < cols; ++j) {
if (helper(board, i, j, 0, word, visited)) return true;
}
}
return false;
}
};