本专栏单纯记录自己刷题过程,便于后续重复刷题更新迭代自己对于同一道题的认知和方法。有好的刷题方法和思路,可以评论区交流,感谢~
1.传统方法就是DFS算法
class Solution {
public void solve(char[][] board) {
if (board.length == 0)
{
return;
}
int m = board.length;
int n = board[0].length;
// 把第一行和最后一行关联的O变成#
for (int i=0; i<m; i++)
{
dfs(board, i, 0);
dfs(board, i, n-1);
}
// 把第一列和最后一列关联的O变成#
for (int j=0; j<n; j++)
{
dfs(board, 0, j);
dfs(board, m-1, j);
}
// 剩下的O都是应该被替换的
for (int i=1; i<m-1; i++)
{
for (int j=1; j<n-1; j++)
{
if (board[i][j] == 'O')
{
board[i][j] = 'X';
}
}
}
// 把所有字符#恢复O
for (int i=0; i<m; i++)
{
for (int j=0; j<n; j++)
{
if (board[i][j] == '#')
{
board[i][j] = 'O';
}
}
}
}
// 从board[i][j]开始DFS,将字符O替换成字符#
void dfs(char[][] board, int i, int j)
{
int m = board.length, n = board[0].length;
// 越界则直接返回
if (i < 0 || i >=m || j < 0 || j >= n)
{
return;
}
if (board[i][j] != 'O')
{
return;
}
// 进行替换
board[i][j] = '#';
// 向四周DFS搜索
dfs(board, i+1, j);
dfs(board, i-1, j);
dfs(board, i, j-1);
dfs(board, i, j+1);
}
}