给定一个二维网格和一个单词,找出该单词是否存在于网格中。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
示例:
board =
[
['A','B','C','E'],
['S','F','C','S'],
['A','D','E','E']
]
给定 word = "ABCCED", 返回 true.
给定 word = "SEE", 返回 true.
给定 word = "ABCB", 返回 false.
法一:
正常回溯,用一个二维数组is_visit表示那个点有没有走过
效率较低
class Solution {
public:
bool exist(vector<vector<char>>& board, string word) {
vector<vector<bool>> is_visit;
for (int i = 0; i < board.size(); ++i) {
vector<bool> temp(board[0].size(), false);
is_visit.push_back(temp);
}
for (int i = 0; i < board.size(); ++i) {
for (int j = 0; j < board[0].size(); ++j) {
if(board[i][j] != word[0])
continue;
if(is_get(board, is_visit, i, j, word, 0) )
return true;
reset(is_visit);
}
}
return false;
}
bool is_get(vector<vector<char>>& board, vector<vector<bool>> &is_vis, int m, int n, string word, int count) {
if (m < 0 || m >= board.size() || n < 0 || n >= board[0].size())
return false;
if (is_vis[m][n] == true)
return false;
if (board[m][n] == word[count]) {
count++;
is_vis[m][n] = true;
if (count == word.size())
return true;
else {
if (
is_get(board, is_vis, m-1, n, word, count) ||
is_get(board, is_vis, m, n-1, word, count) ||
is_get(board, is_vis, m+1, n, word, count) ||
is_get(board, is_vis, m, n+1, word, count) )
return true;
else {
is_vis[m][n] = false;
return false;
}
}
}
else
return false;
}
void reset(vector<vector<bool>> &is_visit) {
for (int i = 0; i < is_visit.size(); ++i) {
for (int j = 0; j < is_visit[0].size(); ++j) {
is_visit[i][j] = false;
}
}
}
};
法二:
不用二维数组标示是否走过,直接把走过的位置的字符改成非字母字符即可
效率提高了不少
class Solution {
public:
bool exist(vector<vector<char>>& board, string word) {
for (int i = 0; i < board.size(); ++i) {
for (int j = 0; j < board[0].size(); ++j) {
if(board[i][j] != word[0])
continue;
if(is_get(board, i, j, word, 0) )
return true;
}
}
return false;
}
bool is_get(vector<vector<char>>& board,int m, int n, string word, int count) {
if (m < 0 || m >= board.size() || n < 0 || n >= board[0].size())
return false;
if (board[m][n] == word[count]) {
count++;
char temp = board[m][n];
board[m][n] = '1';
if (count == word.size())
return true;
else {
if (
is_get(board, m-1, n, word, count) ||
is_get(board, m, n-1, word, count) ||
is_get(board, m+1, n, word, count) ||
is_get(board, m, n+1, word, count) )
return true;
else {
board[m][n] = temp;
return false;
}
}
}
else
return false;
}
};