1. 程式人生 > >LeetCode 79. 單詞搜索(Word Search)

LeetCode 79. 單詞搜索(Word Search)

row als 長度 順序 lee 當前 urn 代碼 ret

題目描述

給定一個二維網格和一個單詞,找出該單詞是否存在於網格中。

單詞必須按照字母順序,通過相鄰的單元格內的字母構成,其中“相鄰”單元格是那些水平相鄰或垂直相鄰的單元格。同一個單元格內的字母不允許被重復使用。

示例:

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 };

LeetCode 79. 單詞搜索(Word Search)