|
1 | 1 | package g0701_0800.s0794_valid_tic_tac_toe_state; |
2 | 2 |
|
3 | | -// #Medium #Array #String #2022_03_26_Time_0_ms_(100.00%)_Space_42.1_MB_(13.47%) |
| 3 | +// #Medium #Array #String #2022_03_30_Time_0_ms_(100.00%)_Space_39.6_MB_(91.75%) |
4 | 4 |
|
5 | 5 | public class Solution { |
6 | 6 | public boolean validTicTacToe(String[] board) { |
7 | | - int cO = 0; |
8 | | - int cX = 0; |
9 | | - for (int x = 0; x < 3; x++) { |
10 | | - for (int y = 0; y < 3; y++) { |
11 | | - char ch = board[x].charAt(y); |
12 | | - if (ch == 'O') { |
13 | | - cO++; |
14 | | - } else if (ch == 'X') { |
15 | | - cX++; |
| 7 | + // X=1,O=-1,’ ’=0 |
| 8 | + int sum = 0; |
| 9 | + int[] winsCol = new int[3]; |
| 10 | + int[] winsDiag = new int[2]; |
| 11 | + boolean xWin = false; |
| 12 | + boolean oWin = false; |
| 13 | + for (int i = 0; i < 3; i++) { |
| 14 | + String str = board[i]; |
| 15 | + int rowSum = 0; |
| 16 | + for (int j = 0; j < 3; j++) { |
| 17 | + // char chr=str.toCharArray()[j]; |
| 18 | + int intchr = 0; |
| 19 | + if (str.toCharArray()[j] == 'X') { |
| 20 | + intchr = 1; |
16 | 21 | } |
| 22 | + if (str.toCharArray()[j] == 'O') { |
| 23 | + intchr = -1; |
| 24 | + } |
| 25 | + rowSum += intchr; |
| 26 | + winsCol[j] += intchr; |
| 27 | + if (i == 2 && winsCol[j] == 3) { |
| 28 | + xWin = true; |
| 29 | + } |
| 30 | + if (i == 2 && winsCol[j] == -3) { |
| 31 | + oWin = true; |
| 32 | + } |
| 33 | + if (Math.abs(i - j) != 1) { |
| 34 | + if (i == j && i == 1) { |
| 35 | + winsDiag[0] += intchr; |
| 36 | + winsDiag[1] += intchr; |
| 37 | + } else if (i == j) { |
| 38 | + winsDiag[0] += intchr; |
| 39 | + } else { |
| 40 | + winsDiag[1] += intchr; |
| 41 | + } |
| 42 | + } |
| 43 | + if (i == 2 && Math.max(winsDiag[0], winsDiag[1]) == 3) { |
| 44 | + xWin = true; |
| 45 | + } |
| 46 | + if (i == 2 && Math.min(winsDiag[0], winsDiag[1]) == -3) { |
| 47 | + oWin = true; |
| 48 | + } |
| 49 | + } |
| 50 | + if (rowSum == 3) { |
| 51 | + xWin = true; |
17 | 52 | } |
| 53 | + if (rowSum == -3) { |
| 54 | + oWin = true; |
| 55 | + } |
| 56 | + sum += rowSum; |
18 | 57 | } |
19 | | - char a1 = board[0].charAt(0); |
20 | | - char a2 = board[0].charAt(1); |
21 | | - char a3 = board[0].charAt(2); |
22 | | - char a4 = board[1].charAt(0); |
23 | | - char a5 = board[1].charAt(1); |
24 | | - char a6 = board[1].charAt(2); |
25 | | - char a7 = board[2].charAt(0); |
26 | | - char a8 = board[2].charAt(1); |
27 | | - char a9 = board[2].charAt(2); |
28 | | - // The main thing here is we just need to check if the given sequence is possible or not. |
29 | | - // We dont need to find any winner. *Logic is the one who has last chance can be in 1 row, |
30 | | - // column(horizontally,vertically or diagonally) not the other one. |
31 | | - // So few cases will arise |
32 | | - // 1) Count of 'X' is 1 more than count of 'O'-> Only X can win and 'O' cannot win (Last |
33 | | - // Chance is with X so only X can win) |
34 | | - // 2) Count of 'X' is equal to count of 'O' -> Only 'O' can win and 'X' cannot win(Check |
35 | | - // few cases)(Last Chance is with 'O' so only 'O' can win) |
36 | | - // 3) return false (rest all are invalid case) |
37 | | - |
38 | | - // Eg - if X=4 and O=3 (ie Count of 'O' is 1 less) then 'O' cannot win and |
39 | | - // if we find such a case then we need to return false else the sequence is fine(try |
40 | | - // yourself & see) |
41 | | - if ((cX - 1) == cO) { |
42 | | - // These are all horizaontal, vertical, diagonal |
43 | | - return (a1 != a2 || a2 != a3 || a1 != 'O') |
44 | | - && (a4 != a5 || a5 != a6 || a4 != 'O') |
45 | | - && (a7 != a8 || a8 != a9 || a7 != 'O') |
46 | | - && (a1 != a5 || a5 != a9 || a1 != 'O') |
47 | | - && (a3 != a5 || a5 != a7 || a3 != 'O') |
48 | | - && (a1 != a4 || a4 != a7 || a1 != 'O') |
49 | | - && (a2 != a5 || a5 != a8 || a2 != 'O') |
50 | | - && (a3 != a6 || a6 != a9 || a3 != 'O'); |
51 | | - } else if (cX == cO) { |
52 | | - // if X=4 and O=4 (ie both r equal) then 'X' cannot win amd |
53 | | - // if we find such a case then we need to return false else the sequence is fine(try |
54 | | - // yourself & see) |
55 | | - return (a1 != a2 || a2 != a3 || a1 != 'X') |
56 | | - && (a4 != a5 || a5 != a6 || a4 != 'X') |
57 | | - && (a7 != a8 || a8 != a9 || a7 != 'X') |
58 | | - && (a1 != a5 || a5 != a9 || a1 != 'X') |
59 | | - && (a3 != a5 || a5 != a7 || a3 != 'X') |
60 | | - && (a1 != a4 || a4 != a7 || a1 != 'X') |
61 | | - && (a2 != a5 || a5 != a8 || a2 != 'X') |
62 | | - && (a3 != a6 || a6 != a9 || a3 != 'X'); |
| 58 | + if (sum == 0 && !xWin) { |
| 59 | + return true; |
63 | 60 | } |
64 | | - return false; |
| 61 | + return sum == 1 && !oWin; |
65 | 62 | } |
66 | 63 | } |
0 commit comments