给定一个 m x n
二维字符网格 board
和一个字符串单词 word
。如果 word
存在于网格中,返回 true
;否则,返回 false
。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
示例 1:
输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED" 输出:true
示例 2:
输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "SEE" 输出:true
示例 3:
输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCB" 输出:false
提示:
m == board.length
n = board[i].length
1 <= m, n <= 6
1 <= word.length <= 15
board
和word
仅由大小写英文字母组成
思路:
dfs。
遇到的坑:一开始每次用的是减少字符串,用substr的,但是这样会超时。
所以再增加一个变量k,每次要比较的就是word[k]和当前字母。
代码:
class Solution {
public:
int dx[4]={-1,0,1,0};
int dy[4]={0,-1,0,1};
int d[10][10];
bool dfs(int x,int y,vector<vector<char>>& board,string s,int k)
{
if(s.length()==k)
{
return true;
}
for(int i=0;i<4;i++)
{
int x1=x+dx[i];
int y1=y+dy[i];
if(x1<0||x1>board.size()-1||y1<0||y1>board[0].size()-1||d[x1][y1]==1)continue;
//cout<<board[x1][y1]<<" "<<s[0]<<endl;
if(board[x1][y1]!=s[k])continue;
d[x1][y1]=1;
if(s.size()>1){
if(dfs(x1,y1,board,s,k+1))return true;
}
else{
return true;
}
d[x1][y1]=0;
}
return false;
}
bool exist(vector<vector<char>>& board, string word) {
int n=board.size();
int m=board[0].size();
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(board[i][j]==word[0]){
memset(d,0,sizeof(d));
d[i][j]=1;
if(word.size()>1){
if(dfs(i,j,board,word,1))return true;
}
else return true;
}
}
}
return false;
}
};