每天一道LeetCode-----在字符方格中查找某个单词
生活随笔
收集整理的這篇文章主要介紹了
每天一道LeetCode-----在字符方格中查找某个单词
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Word Search
原題鏈接Word Search
查找某個單詞是否可以由方格中相鄰的字符組成,相鄰字符指垂直和水平方向的字符,每個位置只能經過一次,即不能重復到達同一個位置
對于圖中示例,當word = “ABCCED”時,找到的路線是第一行的A -> B -> C,然后向下到達C -> E,最后向左達到D,所以可以認為方格中存在單詞”ABCCED”
可以利用回溯法求解,當某個位置不滿足時退回到上一個位置,然后走另一條路
代碼如下
class Solution { public:bool exist(vector<vector<char>>& board, string word) {if(board.empty() || board[0].empty() || word.empty())return true;vector<vector<int>> visited(board.size(), vector<int>(board[0].size(), 0));bool found = false;for(int i = 0; i < board.size(); ++i){for(int j = 0; j < board[i].size(); ++j){/* 找到與首字母相同的位置,開始深度優先+回溯 */if(board[i][j] == word[0]){visited[i][j] = 1;dfs(board, word, i, j, 1, visited, found);if(found) return true;visited[i][j] = 0;}}}return false; } private:void dfs(vector<vector<char>>& board, string& word, int i, int j, int k, vector<vector<int>>& visited, bool& found){if(k == word.size())found = true;for(int p = max(0, i - 1); p < min(static_cast<int>(board.size()), i + 2); ++p){for(int q = max(0, j - 1); q < min(static_cast<int>(board[p].size()), j + 2); ++q){if(found) return;if((p != i && q != j) || (p == i && q == j) || (visited[p][q] == 1) || (board[p][q] != word[k]))continue;/* 又找到一個字符,繼續深度優先 */visited[p][q] = 1;dfs(board, word, p, q, k + 1, visited, found);visited[p][q] = 0;}}} };本題主要利用深度優先+回溯的思想解決,深度優先在解決查找問題時比較常用
總結
以上是生活随笔為你收集整理的每天一道LeetCode-----在字符方格中查找某个单词的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 每天一道LeetCode-----从有序
- 下一篇: 每天一道LeetCode-----计算直