[Problem]
word =
word =
[Solution]
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
.
[Solution]
class Solution {说明:版权所有,转载请注明出处。 Coder007的博客
public:
/**
* DFS
*/
bool DFS(vector<vector<char> > &board, bool **visited, int x, int y, string word, int begin){
// empty string
if(begin == word.size()){
return true;
}
// end of DFS
if(begin == word.size()-1 && board[x][y] == word[begin]){
return true;
}
// DFS
visited[x][y] = true;
int table[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
for(int i = 0; i < 4; ++i){
if(x+table[i][0] < 0 || x+table[i][0] == board.size() || y+table[i][1] < 0 || y+table[i][1] == board[0].size() || visited[x+table[i][0]][y+table[i][1]] || board[x+table[i][0]][y+table[i][1]] != word[begin+1])continue;
// visit
visited[x+table[i][0]][y+table[i][1]] = true;
if(DFS(board, visited, x+table[i][0], y+table[i][1], word, begin+1))return true;
visited[x+table[i][0]][y+table[i][1]] = false;
}
return false;
}
/**
* if word exist in board
*/
bool exist(vector<vector<char> > &board, string word) {
// Note: The Solution object is instantiated only once and is reused by each test case.
// empty string[x+table[i][0]][y+table[i][1]]
if(word.size() == 0)return true;
// invalid
if(board.size() == 0 || board[0].size() == 0 || board.size()*board[0].size() < word.size())return false;
// initial
bool **visited = new bool*[board.size()];
for(int i = 0; i < board.size(); ++i){
visited[i] = new bool[board[i].size()];
}
// search
for(int x = 0; x < board.size(); ++x){
for(int y = 0; y < board[x].size(); ++y){
if(board[x][y] == word[0]){
// initial visited
for(int i = 0; i < board.size(); ++i){
for(int j = 0; j < board[i].size(); ++j){
visited[i][j] = false;
}
}
// DFS
if(DFS(board, visited, x, y, word, 0)){
return true;
}
}
}
}
return false;
}
};