Word Search
题目大意
给你一个字符的二维数组,再给你一个一个单词,检测单词是否存在于数组中。这个单词可以由横向或者竖向组成,但是每个字母只能使用一次。
解题思路
使用DFS。遍历数组,一旦首字母相同,便开始DFS。
代码
class Solution {
public:
int dfs(vector<vector<char> >& board, string word, int row, int col,vector<vector<int> > visit, int num, bool& result)
{
visit[row][col] = 1;
if(num==word.length())
{
result = true;
return 1;
}
else
{
if(result==false && (row+1)<board.size() &&visit[row+1][col]==0 && board[row+1][col]==word[num])
{
visit[row+1][col] == 1;;
dfs(board, word, row+1, col, visit, num+1, result);
}
if(result==false && (col+1)<board[0].size() &&visit[row][col+1]==0 && board[row][col+1]==word[num])
{
visit[row][col+1] == 1;
dfs(board, word, row, col+1, visit, num+1, result);
}
if(result==false && (row-1)>=0 &&visit[row-1][col]==0 && board[row-1][col]==word[num])
{
visit[row-1][col] == 1;
dfs(board, word, row-1, col, visit, num+1, result);
}
if(result==false && (col-1)>=0 &&visit[row][col-1]==0 && board[row][col-1]==word[num])
{
visit[row][col-1] == 1;
dfs(board, word, row, col-1, visit, num+1, result);
}
}
return 0;
}
bool exist(vector<vector<char>>& board, string word) {
bool result = false;
char start = word[0];
for(int i=0;i<board.size();i++)
{
for(int j=0;j<board[0].size();j++)
{
if(board[i][j]==start && result==false)
{
vector<vector<int> > visit(board.size(), vector<int>(board[0].size(), 0));
dfs(board, word, i, j, visit, 1, result);
}
}
}
return result;
}
};
优解
解题思路
也是使用DFS,但是代码可以很简练,我的用时117ms,但是DFS可以降到16ms。
主要的时间节省在于,其省略了visit矩阵,非常巧妙的通过赋值为”*”,避开了visit矩阵。
代码
class Solution {
private:
bool dfs(vector<vector<char>>& board, int row, int col, const string &word, int start, int M, int N, int sLen)
{
char curC;
bool res = false;
if( (curC = board[row][col]) != word[start]) return false;
if(start==sLen-1) return true;
board[row][col] = '*';
if(row>0) res = dfs(board, row-1, col, word, start+1, M, N, sLen);
if(!res && row < M-1) res = dfs(board, row+1, col, word, start+1, M, N, sLen);
if(!res && col > 0) res = dfs(board, row, col-1, word, start+1, M, N, sLen);
if(!res && col < N-1) res = dfs(board, row, col+1, word, start+1, M, N, sLen);
board[row][col] = curC;
return res;
}
public:
bool exist(vector<vector<char>>& board, string word) {
int M,N,i,j,sLen = word.size();
if( (M=board.size()) && (N=board[0].size()) && sLen)
{
for(i=0; i<M; ++i)
for(j=0; j<N; ++j)
if(dfs(board, i, j, word, 0, M, N, sLen)) return true;
}
return false;
}
};