Problem Statement
John and Brus are playing a game where they alternate moves and John goes first. Initially, there is a string that contains only uppercase letters 'X', 'O' and 'L'. A move consists of replacing a single occurrence of 'X' with either 'O' or 'L'. After a player moves, if "LOL" (quotes for clarity) appears as a substring, that player immediately wins and the game ends. Otherwise, the game continues until there are no more 'X's left.
Both players use an optimal game strategy. If a player can win, he will follow the strategy that minimizes the number of moves in the game. Otherwise, if a player can make the game end without a winner, he will follow the strategy that does so (note that in this case the total number of moves in the game does not depend on the chosen strategy). Otherwise, if a player cannot win and cannot end the game in a draw, he will follow the strategy that maximizes the number of moves in the game.
You are given a String s containing the initial state of the game. If the game will end without a winner, return "Draw". If John will win the game, return "John x", and if Brus will win the game, return "Brus x", where x is the number of moves in the game, with no leading zeroes (all quotes for clarity).
Definition
- Class:
- TheStringGame
- Method:
- winner
- Parameters:
- String
- Returns:
- String
- Method signature:
- String winner(String s)
- (be sure your method is public)
Constraints
- s will contain between 1 and 16 characters, inclusive.
- Each character of s will be 'X', 'O' or 'L'.
- s will not contain "LOL" as a substring.
Examples
"XXOXXXLXLX"
Returns: "John 1"
John can win by changing the 'X' between the two 'L's into a 'O'.
"LXXLXXL"
Returns: "Brus 2"
Brus can win this game after John's first move, regardless of what John does.
"LLOOLLOOLLOOLLOO"
Returns: "Draw"
No moves available.
"XXXXXXXXXXXXXXXX"
Returns: "Brus 16"
"L"
Returns: "Draw"
"O"
Returns: "Draw"
"XX"
Returns: "Draw"
"XXX"
Returns: "Draw"
"XXXX"
Returns: "Draw"
"XXXXX"
Returns: "Draw"
"XXXXXX"
Returns: "Draw"
"XXXXXXX"
Returns: "John 7"
"XXXXXXXX"
Returns: "Draw"
"XXXXXXXXX"
Returns: "John 9"
"XXXXXXXXXX"
Returns: "Draw"
"XXXXXXXXXXX"
Returns: "John 11"
"XXXXXXXXXXXX"
Returns: "Draw"
"XXXXXXXXXXXXX"
Returns: "John 13"
"XXXXXXXXXXXXXX"
Returns: "Draw"
"XXXXXXXXXXXXXXX"
Returns: "John 15"
"X"
Returns: "Draw"
"LXXXXXXXXXOX"
Returns: "Draw"
"OXXXXXXXXXLXX"
Returns: "John 11"
"LXLXLXLXLXLXLXL"
Returns: "John 1"
"OOOOOOOOOOOOOOOO"
Returns: "Draw"
"XXOX"
Returns: "Draw"
"LXXLXXLXXLXXLXXL"
Returns: "Brus 2"
"LXXXXXL"
Returns: "John 3"
"OXOXOXXXXXOO"
Returns: "Draw"
"OOXOOXOOXXOXO"
Returns: "Draw"
"OXXXOXXO"
Returns: "Draw"
"OXXOXXOXXOXXOXXO"
Returns: "Draw"
"LXXXXXXXXXXXXXXL"
Returns: "Brus 14"
"LXXXOXOXXXL"
Returns: "John 7"
"LXLXLXXXXXLLLLLX"
Returns: "John 1"
"LXLLXXLXLX"
Returns: "John 1"
"XXXLXXLLLLXXLL"
Returns: "John 3"
"XLXLXXXXLXX"
Returns: "John 1"
"LXXXXXXXXXLXXLXX"
Returns: "John 11"
"XXXXXXLXXXXXXXX"
Returns: "Brus 14"
"XXLLLXXXXLXLXLX"
Returns: "John 1"
"XXXXXXXXXXXXXXLL"
Returns: "Brus 14"
"XXXXXLXXLXXLLXX"
Returns: "John 7"
"XXXXXXXOOXXXXXXX"
Returns: "Brus 14"
"LXXXXXXXXXXXXXXX"
Returns: "John 13"
"XXLXXXXXXXXXXXXX"
Returns: "John 15"
"XXXXXXXXLXXXXXXX"
Returns: "John 13"
"LXXXXXXXOXXXXXXL"
Returns: "John 11"
"XXXXXXXXLXXXXXX"
Returns: "Brus 14"
"XXXXXXXXXXXXXXXL"
Returns: "John 13"
"XXXXXXXXXXXXXXXO"
Returns: "John 15"
"XXOXXXXLXXXLXXXX"
Returns: "John 11"
"XXXXXXXLXXXXXXXX"
Returns: "John 13"