题目:
思路:首先 将不需要替换的O 替换为另一个字符*,然后将需要替换的字符替换为X,再将字符*替换会O,由于行数或者列数少于两行的时候 ,字符一定是在边界上,所以直接返回不需要计算
替换方法:使用深度优先算法 递归将不需要替换的字符替换为*号。
class Solution {
public void solve(char[][] board) {
// 首先判断行和列 行和列少于2 直接return
if(board==null || board.length < 3) {
return;
}
if(board[0]==null || board.length < 3) {
return;
}
//获取边界,第一行和最后一行 及中间行的首尾 将其替换为*号
int col = board[0].length;
int row = board.length;
//替换行
for(int i = 0; i < row; i++) {
dfs(board, i, 0);
dfs(board, i, col-1);
}
//替换列
for(int i = 0; i < col; i++) {
dfs(board, 0, i);
dfs(board, row-1, i);
}
//循环替换所有节点 将O替换为X 将*替换为O
for(int i = 0; i < row; i++) {
for(int j = 0; j < col; j++) {
if(board[i][j] == 'O') {
board[i][j] = 'X';
}
if(board[i][j] == '*') {
board[i][j] = 'O';
}
}
}
}
//使用深度优先算法 将边界及临近区域的O改为*
public void dfs(char[][] board, int row, int col) {
if(row >= board.length || col >= board[0].length || row < 0 || col < 0 || board[row][col] != 'O' ) {
return;
}
board[row][col] = '*';
dfs(board, row-1, col);
dfs(board, row, col-1);
dfs(board, row+1, col);
dfs(board, row, col+1);
}
}