题目
给定一个二维网格和一个单词,找出该单词是否存在于网格中。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
board =
[
['A','B','C','E'],
['S','F','C','S'],
['A','D','E','E']
]
示例1
输入:
word = “ABCCED”
输出:
true
示例2
输入:
word = “SEE”
输出:
true
示例3
输入:
word = “ABCB”
输出:
false
思路
- 首先找到board中和word第一个字符相匹配的,这个位置标记为使用
- 进入dfs,深度搜索,搜索的方向沿上下左右
- 满足条件:
- 下标合法
- 未被使用
- 和目标字符串 下标对应字符相同
- 此位置标记为使用,进入dfs
- dfs记得把位置标记为未使用
- dfs退出条件:
- 现在找到字符串已经比目标的长了
- 现在找到其中之一解了
- 找到的字符串长度和目标的一样长 标记答案为true 返回
代码
#include <stdio.h>
#include <vector>
#include <iostream>
#include <cstring>
using namespace std;
class Solution {
public:
int dirx[4] = {1,0,-1,0};
int diry[4] = {0,-1,0,1};
int m,n;
bool exist(vector<vector<char>>& board, string word) {
m = board.size(),n = board[0].size();
vector<vector<int>> vis(m,vector<int>(n,0));
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(board[i][j]==word[0]){
bool flag = false;
vis[i][j]=1;
dfs(board,vis,i,j,word,1,flag);
vis[i][j]=0;
if(flag == true)
return true;
}
}
}
return false;
}
void dfs(vector<vector<char>>& board,vector<vector<int>>& vis,int x,int y,string& word,int now_id,bool &flag){
if(now_id > word.size()){return;}
if(flag == true){return ;}
if(now_id==word.size()){
flag = true;
return ;
}
for(int i=0;i<4;i++){
int dx = dirx[i]+x;
int dy = diry[i]+y;
if(dx >=0 && dx < m && dy >=0 && dy<n && vis[dx][dy]==0 && board[dx][dy] == word[now_id]){
vis[dx][dy]=1;
dfs(board,vis,dx,dy,word,now_id+1,flag);
vis[dx][dy] =0;
}
}
}
};
int main(){
vector<vector<char>> board={
{'A','B','C','E'},
{'S','F','C','S'},
{'A','D','E','E'}
};
Solution s;
cout<<s.exist(board, "ABCCED");
return 0;
}
今天也是爱zz的一天哦!