日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

每天一道LeetCode-----在字符方格中查找某个单词

發布時間:2024/4/19 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 每天一道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-----在字符方格中查找某个单词的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。