题目大意:给出一个二维字符数组和一个字符串,判断该字符串是否可由数组中水平或竖直方向的临近字符组成。
算法思想:
1.遍历字符数组的每一个位置,将此位置作为字符串搜索的起点,然后经行深度优先搜索。
2.深度优先搜索的过程中,若当前已搜索满足条件的字符数是否和字符串的长度相等返回真值,否则看搜索位置是否合法,是否位访问,是否该字符等于字符串中对应的字符;
然后递归的进行该位置的上下左右四个方向的搜索。返回搜索的结果。
代码如下:
class Solution {
public:
bool exist(vector<vector<char>>& board, string word) {
int m = board.size();
if (m == 0) return false;
int n = board[0].size();
if (n == 0) return false;
vector<vector<bool> >visit(m,vector<bool>(n,false));
for (int i = 0; i < m;++i){
for (int j = 0; j < n;++j){
if (dfs(board, word, i, j, 0, visit)){
return true;
}
}
}
return false;
}
bool dfs(vector<vector<char>>&board,string &word,int x,int y,int index,vector<vector<bool> >&visit){
if (index == word.size()) return true;
if (x < 0 || y<0 || x >= board.size() || y>=board[0].size())
return false;
if (visit[x][y])
return false;
if (board[x][y] != word[index]) return false;
visit[x][y]=true;
bool res=dfs(board,word,x-1,y,index+1,visit)||
dfs(board,word,x+1,y,index + 1, visit)||
dfs(board, word,x, y-1,index + 1, visit)||
dfs(board, word,x, y+1,index + 1, visit);
visit[x][y]=false;
return res;
}
};