每天一道LeetCode-----找到所有被某个字符包围的另一个字符
生活随笔
收集整理的這篇文章主要介紹了
每天一道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-----找到所有被某个字符包围的另一个字符的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: STL源码学习(一)迭代器概念与trai
- 下一篇: 每天一道LeetCode-----将字符