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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

每天一道LeetCode-----找到所有被某个字符包围的另一个字符

發布時間:2024/4/19 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 每天一道LeetCode-----找到所有被某个字符包围的另一个字符 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Surrounded Regions

原題鏈接Surrounded Regions

給定一個二維方格,每個格子上只有’X’和’O’兩種字符,要求將所有被’X’包圍的’O’都變為’X’

如果直接求解,那么對于一個字符’O’而言,判斷它是否能夠被’X’包圍是不太容易的事情。那么轉換一下思路,可以找到所有不能被’X’包圍的’O’,剩下的就全是被包圍的了

如果一個’O’不能被’X’包圍,那么從這個’O’開始一定有一條連通的路徑到達方格的邊界。所以可以從方格邊界入手,如果碰到’O’,那么就從這個’O’開始一直走,途徑每個’O’都是無法被’X’包圍的’O’。可以先將這些’O’設置成其它字符,等到最后重新遍歷時,這些其他字符仍然變為’O’,而其他的’O’則變為’X’

代碼如下

class Solution { public:void solve(vector<vector<char>>& board) {if(board.empty() || board[0].empty())return;int m = board.size();int n = board[0].size();for(int i = 0; i < m; ++i){if(board[i][0] == 'O')changeToOne(board, i, 0);if(board[i][n - 1] == 'O')changeToOne(board, i, n - 1);}for(int j = 0; j < n; ++j){if(board[0][j] == 'O')changeToOne(board, 0, j);if(board[m - 1][j] == 'O')changeToOne(board, m - 1, j);}for(int i = 0; i < m; ++i){for(int j = 0; j < n; ++j){board[i][j] = (board[i][j] == '1') ? 'O' : 'X';}}} private:void changeToOne(vector<vector<char>>& board, int row, int col){board[row][col] = '1';for(auto& p : directions){int x = row + p[0];int y = col + p[1];if(x < 0 || x >= board.size() || y < 0 || y >= board[x].size())continue;if(board[x][y] != 'O')continue;changeToOne(board, x, y);}} private:static vector<vector<int>> directions; }; vector<vector<int>> Solution::directions = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};

通常情況下,如果遇到很難直接求解的問題時,可以嘗試從另一個角度尋找答案。本題直接尋找被包圍的’O’是不太容易的,所以可以先找那些不能被包圍的’O’,剩下的就是要找的那些字符

總結

以上是生活随笔為你收集整理的每天一道LeetCode-----找到所有被某个字符包围的另一个字符的全部內容,希望文章能夠幫你解決所遇到的問題。

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