|
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