leetcode || 79、Word Search
来源:程序员人生 发布时间:2015-04-30 09:06:59 阅读次数:3574次
problem:
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
.
Hide Tags
Array Backtracking
题意:在1个字符矩阵中搜索1个字,每一个字符只能使用1次,搜索方向为上下左右
thinking:
(1)肯定方法:全局搜索满足条件的解,使用DFS
(2)深搜成功的条件是:深搜成功1次,步数+1,直到深搜的步数到达word的长度
(3)新开1个矩阵大小的2维数组,记录矩阵的字符是不是用过,先在矩阵中搜索word[0]的位置,1次为出发点开始深搜,每次搜索上下左右4个方向
code:
class Solution {
private:
bool flag;
public:
bool exist(vector<vector<char> > &board, string word) {
int m=board.size();
int n=board[0].size();
int Maxdep=word.size();
flag = false;
vector<int> a1(n,0);
vector<vector<int> > array(m,a1);
for(int i=0;i<m;i++) //寻觅搜索出发点
{
for(int j=0;j<n;j++)
{
if(flag) //加快搜索
return true;
if(board[i][j]==word[0])
dfs(0,Maxdep,i,j,array,board,word);
}
}
return flag;
}
protected:
void dfs(int dep,int Maxdep,int x, int y,vector<vector<int> > &array,
vector<vector<char> > &board, string word)
{
if(flag) //不能去掉,去掉就超时了
return;
int m=board.size();
int n=board[0].size();
if(dep==Maxdep) //这个必须放在x,y 边界判断的前面
{
flag=true;
return ;
}
if(x<0 || x>=m || y<0 || y>=n)
return;
if(array[x][y]==1)
return;
if(board[x][y]==word[dep]) //4个方向深搜
{
array[x][y]=1;
dfs(dep+1,Maxdep,x⑴,y,array,board,word);
dfs(dep+1,Maxdep,x,y⑴,array,board,word);
dfs(dep+1,Maxdep,x+1,y,array,board,word);
dfs(dep+1,Maxdep,x,y+1,array,board,word);
array[x][y]=0;
}
}
};
生活不易,码农辛苦
如果您觉得本网站对您的学习有所帮助,可以手机扫描二维码进行捐赠