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 =spa
[ ["ABCE"], ["SFCS"], ["ADEE"] ]
word = "ABCCED"
, -> returns true
,
word = "SEE"
, -> returns true
,
word = "ABCB"
, -> returns false
.code
解題思路:blog
使用深度優先搜索的方法,從二維數組中的每一個點出發,向上下左右進行延伸,根據斷定條件及時判斷;遞歸
解題步驟:字符串
一、寫一個主函數:string
(1)得到二維數組的行列大小;io
(2)遍歷全部二維數組元素,對每一個元素做爲搜索起點,調用遞歸函數;class
二、寫一個遞歸函數,參數爲:二維數組(引用)、待匹配的字符串(c字符串形式方便)、當前運動到的座標值x和y、二維數組大小m和n;
(1)終止斷定條件:x和y無效、當前運動到的字符不是字符串下一個字符;
(2)若是已經到達匹配字符串末尾,返回true
(3)暫時將當前運動到的座標字符置換爲'\0',由於要作出標記,以避免重複折返運動;
(4)調用4個遞歸函數,分別運動到當前運動字符的上下左右四周,並斷定;
(5)若是4個遞歸函數都false,則換回被置換的'\0',返回false;
代碼:
1 class Solution { 2 public: 3 bool exist(vector<vector<char> > &board, string word) { 4 m = board.size(); 5 n = board[0].size(); 6 for(int x = 0; x < m; x++) { 7 for(int y = 0; y < n; y++) { 8 if(isFound(board, word.c_str(), x, y)) 9 return true; 10 } 11 } 12 return false; 13 } 14 15 private: 16 int m; 17 int n; 18 bool isFound(vector<vector<char> > &board, const char* w, int x, int y) { 19 if(x < 0 || y < 0 || x >= m || y >= n || *w != board[x][y]) 20 return false; 21 if(*(w + 1) == '\0') 22 return true; 23 char t = board[x][y]; 24 board[x][y] = '\0'; 25 if(isFound(board, w + 1, x - 1, y) || 26 isFound(board, w + 1, x + 1, y) || 27 isFound(board, w + 1, x, y - 1) || 28 isFound(board, w + 1, x, y + 1)) 29 return true; 30 board[x][y]=t; 31 return false; 32 } 33 };