LeetCode 79. 单词搜索(Word Search)

题目描述

给定一个二维网格和一个单词,找出该单词是否存在于网格中。

单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。

示例:

board =
[
  ['A','B','C','E'],
  ['S','F','C','S'],
  ['A','D','E','E']
]

给定 word = "ABCCED", 返回 true.
给定 word = "SEE", 返回 true.
给定 word = "ABCB", 返回 false.

解题思路

本题可用回溯法来求解。定义一个访问数组初始全部置为0,并定义当前路径长度初始置0,从矩阵第一个字符开始遍历:

  • 从当前字符出发,若与字符串对应路径长度的字符相等,就分别向上下左右走一步,并把当前字符访问数组置1,路径长度加1;
  • 若当前字符走到了字符串末尾,说明存在一条路径与字符串相等,返回true;
  • 若当前字符出发的各条路径都不能找到一条路径与字符串相等,则向当前路径上一步回溯,并把当前字符访问数组置0,路径长度减1

代码

 1 class Solution {
 2 public:
 3     bool exist(vector<vector<char>>& board, string word) {
 4         if(board.empty()||word=="")
 5             return false;
 6         int rows=board.size();
 7         int cols=board[0].size();
 8         for(int i=0;i<rows;i++){
 9             for(int j=0;j<cols;j++){
10                 vector<vector<bool>> visit(rows,vector<bool>(cols,false));
11                 if(find(visit,board,word,0,i,j))
12                     return true;
13             }
14         }
15         return false;
16     }
17     bool find(vector<vector<bool>> &visit, vector<vector<char>>& board, string word, int idx, int row, int col){
18         if(idx==word.size())
19             return true;
20         int rows=board.size();
21         int cols=board[0].size();
22         if(row<rows&&row>=0&&col<cols&&col>=0&&!visit[row][col]&&board[row][col]==word[idx]){
23             visit[row][col]=true;
24             bool hasPath=find(visit,board,word,idx+1,row+1,col)||find(visit,board,word,idx+1,row,col+1)||
25                 find(visit,board,word,idx+1,row-1,col)||find(visit,board,word,idx+1,row,col-1);
26             if(!hasPath)
27                 visit[row][col]=false;
28             else
29                 return true;
30         }
31         return false;
32     }
33 };

猜你喜欢

转载自www.cnblogs.com/wmx24/p/9025879.html