解题思路:
从board最边缘一圈开始向内使用DFS,将可以连通外圈的O设为'#',最后将所有的'#'转化为'O',将其他的'O'转化为'X'。提交代码:
class Solution{
public void solve(char[][] board) {
if(board.length==0||board.length==1||board.length==2) return;
int m=board.length;
int n=board[0].length;
// DFS up
for(int i=0;i<n;i++) {
if(board[0][i]=='O') {
board[0][i]='#';
DFS(0,i,board);
}
}
// right
for(int j=1;j<m;j++) {
if(board[j][n-1]=='O') {
board[j][n-1]='#';
DFS(j,n-1,board);
}
}
//bottom
for(int i=0;i<n-1;i++) {
if(board[m-1][i]=='O') {
board[m-1][i]='#';
DFS(m-1,i,board);
}
}
//left
for(int j=1;j<m-1;j++) {
if(board[j][0]=='O') {
board[j][0]='#';
DFS(j,0,board);
}
}
for(int i=0;i<m;i++) {
for(int j=0;j<n;j++) {
if(board[i][j]=='X') continue;
if(board[i][j]=='#')
board[i][j]='O';
else
board[i][j]='X';
}
}
}
private void DFS(int x,int y,char[][] board) {
if(x-1>=0) {
if(board[x-1][y]=='O') {
board[x-1][y]='#';
DFS(x-1,y,board);
}
}
if(x+1<board.length) {
if(board[x+1][y]=='O') {
board[x+1][y]='#';
DFS(x+1,y,board);
}
}
if(y-1>=0) {
if(board[x][y-1]=='O') {
board[x][y-1]='#';
DFS(x,y-1,board);
}
}
if(y+1<board[0].length) {
if(board[x][y+1]=='O') {
board[x][y+1]='#';
DFS(x,y+1,board);
}
}
}
}
运行结果: