題目描述
給定一個?m x n
?二維字符網格?board
?和一個字符串單詞?word
?。如果?word
?存在于網格中,返回?true
?;否則,返回?false
?。
單詞必須按照字母順序,通過相鄰的單元格內的字母構成,其中“相鄰”單元格是那些水平相鄰或垂直相鄰的單元格。同一個單元格內的字母不允許被重復使用。
示例 1:
輸入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED" 輸出:true
示例 2:
輸入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "SEE" 輸出:true
示例 3:
輸入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCB" 輸出:false
提示:
m == board.length
n = board[i].length
1 <= m, n <= 6
1 <= word.length <= 15
board
?和?word
?僅由大小寫英文字母組成
解決方案:
1、越界檢查
2、終止條件:字符符合,字符串長度達到,該位置已遍歷
3、單層循環邏輯:pos + 1,上下左右四方向判斷
函數源碼:
class Solution { public:bool exist(vector<vector<char>>& board, string word) {if(board.empty()) return false;int m=board.size(),n=board[0].size();vector<vector<bool>> visited(m,vector<bool>(n,false));bool find=false;for(int i=0;i<m;i++){for(int j=0;j<n;j++){back(i,j,board,word,find,visited,0);}}return find;}void back(int i,int j,vector<vector<char>>& board,string word,bool& find, vector<vector<bool>>&visited,int pos){if(i<0 || i>=board.size() || j<0 || j>=board[0].size()) return;if(visited[i][j] || find || board[i][j] != word[pos]) return;if(pos == word.size()-1){find=true;return;}visited[i][j]=true; //已遍歷back(i+1,j,board,word,find,visited,pos+1);back(i-1,j,board,word,find,visited,pos+1);back(i,j-1,board,word,find,visited,pos+1);back(i,j+1,board,word,find,visited,pos+1);visited[i][j] = false;}};