Given a 2D board and a word, find if the word exists in the grid.
The word can be constructed from letters of sequentially adjacent cell, where "adjacent" cells are those horizontally or vertically neighboring. The same letter cell may not be used more than once.
For example,
Given board =
[ ["ABCE"], ["SFCS"], ["ADEE"] ]word =
"ABCCED"
, -> returns
true
,
word =
"SEE"
, -> returns
true
,
word = "ABCB"
, -> returns false
.
第一次没有考虑查找字符串很长的情况,没有用引用,大数据通不过
class Solution {
public:
bool check(vector<vector<char> >& board, int i, int j, string word, vector<vector<bool> >& flag)
{
if (board[i][j] != word[0])
return false;
if (word.empty())
return true;
flag[i][j] = true;
if (i > 0 && !flag[i - 1][j] && check(board, i - 1, j, word.substr(1), flag))
return true;
if (i + 1 < board.size() && !flag[i +1][j] && check(board, i +1, j, word.substr(1), flag))
return true;
if (j > 0 && !flag[i][j - 1] && check(board, i, j - 1, word.substr(1), flag))
return true;
if (j + 1 < board[0].size() && !flag[i][j + 1] && check(board, i, j + 1, word.substr(1), flag))
return true;
flag[i][j] = false;
return false;
}
bool exist(vector<vector<char> > &board, string word)
{
if (board.empty()) return false;
vector<vector<bool> >flag(board.size(), vector<bool>(board[0].size(), 0));
for (int i = 0; i < board.size(); i++)
for (int j = 0; j < board[0].size(); j++)
{
if (check(board, i, j, word, flag))
return true;
}
return false;
}
};
细节太重要了,这个解法再次验证了优化多么重要,对于小数据可能测试通过,一旦大数据,细节上优化起关键作用
class Solution {
public:
bool check(vector<vector<char> >& board, int i, int j, string& word, int depth, vector<vector<bool> >& flag)
{
if (board[i][j] != word[depth])
return false;
if (depth == word.size() - 1)
return true;
flag[i][j] = true;
if (i > 0 && !flag[i - 1][j] && check(board, i - 1, j, word, depth + 1, flag))
return true;
if (i + 1 < board.size() && !flag[i +1][j] && check(board, i +1, j,word, depth + 1, flag))
return true;
if (j > 0 && !flag[i][j - 1] && check(board, i, j - 1, word, depth + 1, flag))
return true;
if (j + 1 < board[0].size() && !flag[i][j + 1] && check(board, i, j + 1, word, depth + 1, flag))
return true;
flag[i][j] = false;
return false;
}
bool exist(vector<vector<char> > &board, string word)
{
if (board.empty()) return false;
vector<vector<bool> >flag(board.size(), vector<bool>(board[0].size(), 0));
for (int i = 0; i < board.size(); i++)
for (int j = 0; j < board[0].size(); j++)
{
if (check(board, i, j, word, 0, flag))
return true;
}
return false;
}
};