leetcode794. 有效的井字游戏(mid)(每日一题)

有效的井字游戏


力扣链接

题目描述

给你一个字符串数组 board 表示井字游戏的棋盘。当且仅当在井字游戏过程中,棋盘有可能达到 board 所显示的状态时,才返回 true

井字游戏的棋盘是一个 3 x 3 数组,由字符 ' ''X''O' 组成。字符 ' ' 代表一个空位。

以下是井字游戏的规则:

  • 玩家轮流将字符放入空位(' ')中。
  • 玩家 1 总是放字符 'X' ,而玩家 2 总是放字符 'O'
  • 'X''O' 只允许放置在空位中,不允许对已放有字符的位置进行填充。
  • 当有 3 个相同(且非空)的字符填充任何行、列或对角线时,游戏结束。
  • 当所有位置非空时,也算为游戏结束。
  • 如果游戏结束,玩家不允许再放置字符。

解题思路

官方题解链接

  • 分类讨论

代码

class Solution {
    
    
    public boolean validTicTacToe(String[] board) {
    
    
        int xCount = 0;
        int oCount = 0;
        for (String str : board) {
    
    
            for (char c : str.toCharArray()) {
    
    
                xCount = c == 'X' ? xCount + 1 : xCount;
                oCount = c == 'O' ? oCount + 1 : oCount;
            }
        }

        if (oCount != xCount && xCount - oCount != 1) {
    
    
            return false;
        }

        if (win(board, 'X') && xCount - oCount != 1) {
    
    
            return false;
        }

        if (win(board, 'O') && xCount != oCount) {
    
    
            return false;
        }

        return true;
    }

    boolean win(String[] board, char c) {
    
    
        for (int i = 0; i < 3; i++) {
    
    
            if (board[i].charAt(0) == c && board[i].charAt(1) == c && board[i].charAt(2) == c) {
    
    
                return true;
            }
            if (board[0].charAt(0) == c && board[1].charAt(0) == c && board[2].charAt(0) == c) {
    
    
                return true;
            }
        }

        if (board[0].charAt(0) == c && board[1].charAt(1) == c && board[2].charAt(2) == c) {
    
    
            return true;
        }

        if (board[0].charAt(2) == c && board[1].charAt(1) == c && board[2].charAt(0) == c) {
    
    
            return true;
        }
        return false;
    }
}

复杂度

  • 时间复杂度:O©,由于此题给定的棋盘大小为常数 C=9,因此时间复杂度为常数。

  • 空间复杂度:O(1)。

Guess you like

Origin blog.csdn.net/qq_43478625/article/details/121814434