图论
dfs/bfs
dfs代码框架
void dfs(参数) {
if (终止条件) {
存放结果;
return;
}
for (选择:本节点所连接的其他节点) {
处理节点;
dfs(图,选择的节点); // 递归
回溯,撤销处理结果
}
}
思路:本题要求找到被x围绕的陆地,所以边界的陆地O肯定不符合条件。那么我们只要从周边找到陆地O然后 通过 dfs或者bfs 将周边靠陆地且相邻的陆地O都变成A,然后再去重新遍历地图的时候,把剩下的O变成X,再把所有的A变成O。
for(int i=0;i<4;i++){
nextx=x+dir[i][0];
nexty=y+dir[i][1];
if(nextx<0||nextx>=board.size()||nexty<0||nexty>=board[0].size())
continue;
}
class Solution {
public:
int dir[4][2] = {-1, 0, 0, -1, 1, 0, 0, 1};
void dfs(vector<vector<char>>& board, int x, int y){
board[x][y]='A';
for(int i=0;i<4;i++){
int nextx=x+dir[i][0];
int nexty=y+dir[i][1];
if(nextx<0||nextx>=board.size()||nexty<0||nexty>=board[0].size())
continue;
if(board[nextx][nexty]=='X'||board[nextx][nexty]=='A')
continue;
dfs(board, nextx, nexty);
}
return;
}
void solve(vector<vector<char>>& board) {
int n=board.size(), m=board[0].size();
for(int i=0;i<n;i++)
{
if(board[i][0]=='O')
dfs(board,i,0);
if(board[i][m-1]=='O')
dfs(board,i,m-1);
}
for(int j=0;j<m;j++)
{
if(board[0][j]=='O')
dfs(board,0,j);
if(board[n-1][j]=='O')
dfs(board,n-1,j);
}
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
if (board[i][j] == 'O')
board[i][j] = 'X';
if (board[i][j] == 'A')
board[i][j] = 'O';
}
return;
}
};
回溯
切割问题类似组合问题
for循环表示在哪里切下第1刀
递归表示在第一刀的基础上,下面的几刀在哪切
if(startIndex>=s.length()){
result.push_back(path);
return;
}
for(int i=startIndex; i<s.length();i++)
{
if(isPalindrome(s, startIndex, i)){
string str = s.substr(startIndex, i - startIndex + 1);
path.push_back(str);
}
else continue;
backtracking(s, i+1);
path.pop_back();
}
然后要写是否是回文子串
双指针,一前一后对比
bool isPalindrome(const string& s, int startIndex, int end)
{
for(int i=startIndex, int j=end;i<j; i++,j--)
{
if(s[i]!=s[j])
return false;
}
return true;
}
整体代码
class Solution {
public:
bool isPalindrome(const string& s, int startIndex, int end)
{
for(int i=startIndex,j=end;i<j; i++,j--)
{
if(s[i]!=s[j])
return false;
}
return true;
}
vector<vector<string>> result;
vector<string> path;
void backtracking (const string& s, int startIndex)
{
if(startIndex>=s.length()){
result.push_back(path);
return;
}
for(int i=startIndex; i<s.length();i++)
{
if(isPalindrome(s, startIndex, i)){
string str = s.substr(startIndex, i - startIndex + 1);
path.push_back(str);
}
else continue;
backtracking(s, i+1);
path.pop_back();
}
return;
}
vector<vector<string>> partition(string s) {
result.clear();
path.clear();
backtracking(s, 0);
return result;
}
};