太坑了!老是时间超限,不是时间超限就是内存超限!
思路很简单,就是先遍历整个网格寻找开头,然后上下左右搜寻找下一个字母,引用递归。
最终看边答案边写出来的:
cpp
class Solution {
public:
bool exist(vector<vector<char>>& board, string word) {
m=board.size();
n=board[0].size();
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(hs(board,word,i,j,0)==1) return 1;
}
}
return 0;
}
private:
int m,n;
bool hs(vector<vector<char>> &board,string word,int x,int y,int k){
if(word[k]!=board[x][y]) return 0;
if(k==word.size()-1) return 1;
board[x][y]='/0';
bool b=0;
k++;
if(x>0) b=b||hs(board,word,x-1,y,k);
if(y>0) b=b||hs(board,word,x,y-1,k);
if(x<m-1) b=b||hs(board,word,x+1,y,k);
if(y<n-1) b=b||hs(board,word,x,y+1,k);
board[x][y]=word[k-1];
return b;
}
};
看了下面的评论老哥,学到了一个时间超限的知识点...
意思是函数直接传入值比传入指针慢很多(可以解释为什么我照着答案抄都抄不对了),于是又去试了一下,将递归函数的传入参数都尽量改成了指针:
cpp
class Solution {
public:
bool exist(vector<vector<char>>& board, string word) {
m=board.size();
n=board[0].size();
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
int k=0;
if(hs(board,word,i,j,k)==1) return 1;
}
}
return 0;
}
private:
int m,n;
bool hs(vector<vector<char>> &board,string &word,int x,int y,int &k){
if(word[k]!=board[x][y]) return 0;
if(k==word.size()-1) return 1;
board[x][y]='/0';
bool b=0;
k++;
if(x>0) b=b||hs(board,word,x-1,y,k);
if(y>0) b=b||hs(board,word,x,y-1,k);
if(x<m-1) b=b||hs(board,word,x+1,y,k);
if(y<n-1) b=b||hs(board,word,x,y+1,k);
k--;
board[x][y]=word[k];
return b;
}
};
果不其然啊!!