思路:
1,为了避免重复结果同一个元素,可以匹配正确该元素后把该位置赋空字符\0,但是要在其他路径搜索前恢复该字符。
2,匹配正确一个元素后,最多有四个方向可能有解,但是要考虑矩阵边界。
3,由于不需要返回具体路线,所以可以根据设置标志位来判断剪枝操作。
看了思路以后写出,要复习
巧妙的一点是利用回溯法,同时搜索和返回了res,
需要注意的是在下一个路径开始前要还原字符。
class Solution {
public:
int col,row;
bool exist(vector<vector<char>>& board, string word) {
int i=0,j=0;
row=board.size();
col=board[0].size();
for(i=0;i<row;i++){
for(j=0;j<col;j++){
if(dfs(board,word,i,j,0))
return true;
}
}
return false;
}
bool dfs(vector<vector<char>>& board,string word,int i,int j,int k){
if(i<0||j<0||i>=row||j>=col||board[i][j]!=word[k])
return false;
if(k==word.size()-1)
return true;
board[i][j]='\0'; //还要考虑到本次循环走完到下一个开头时还原字符
int res=0;
res=dfs(board,word,i-1,j,k+1)||dfs(board,word,i+1,j,k+1)||dfs(board,word,i,j-1,k+1)||dfs(board,word,i,j+1,k+1);
board[i][j]=word[k];
return res;
}
};