Skip to content
Related Articles
Open in App
Not now

Related Articles

Find the winner of the Game to Win by erasing any two consecutive similar alphabets

Improve Article
Save Article
  • Difficulty Level : Medium
  • Last Updated : 03 Aug, 2022
Improve Article
Save Article

Given a string consisting of lower case alphabets.
Rules of the Game: 
 

  • A player can choose a pair of similar consecutive characters and erase them.
  • There are two players playing the game, the player who makes the last move wins.

The task is to find the winner if A goes first and both play optimally. 
Examples: 
 

Input: str = "kaak" 
Output: B
Explanation:
    Initial String: "kaak"
    A's turn:
        removes: "aa"
        Remaining String: "kk"
    B's turn:
        removes: "kk"
        Remaining String: ""
    Since B was the last one to play
    B is the winner.

Input: str = "kk"
Output: A

 

Approach: We can use a stack to simplify the problem. 
 

  • Each time we encounter a character that is different from the one present in the top of the stack we add it to the stack.
  • If the stack top and the next character match we pop the character from the stack and increment the count.
  • At the end, we just need to see who wins by checking count%2.

Below is the implementation of the above approach: 
 

C++




#include <bits/stdc++.h>
using namespace std;
 
// Function to play the game
// and find the winner
void findWinner(string s)
{
    int i, count = 0, n;
    n = s.length();
    stack<char> st;
 
    // ckecking the top of the stack with
    // the i th character of the string
    // add it to the stack if they are different
    // otherwise increment count
    for (i = 0; i < n; i++) {
        if (st.empty() || st.top() != s[i]) {
            st.push(s[i]);
        }
        else {
            count++;
            st.pop();
        }
    }
 
    // Check who has won
    if (count % 2 == 0) {
        cout << "B" << endl;
    }
    else {
        cout << "A" << endl;
    }
}
 
// Driver code
int main()
{
    string s = "kaak";
 
    findWinner(s);
 
    return 0;
}

Java




// Java implementation for above approach
import java.util.*;
 
class GFG
{
 
// Function to play the game
// and find the winner
static void findWinner(String s)
{
    int i, count = 0, n;
    n = s.length();
    Stack<Character> st = new Stack<Character>();
 
    // ckecking the top of the stack with
    // the i th character of the string
    // add it to the stack if they are different
    // otherwise increment count
    for (i = 0; i < n; i++)
    {
        if (st.isEmpty() ||
            st.peek() != s.charAt(i))
        {
            st.push(s.charAt(i));
        }
        else
        {
            count++;
            st.pop();
        }
    }
 
    // Check who has won
    if (count % 2 == 0)
    {
        System.out.println("B");
    }
    else
    {
        System.out.println("A");
    }
}
 
// Driver code
public static void main(String[] args)
{
    String s = "kaak";
 
    findWinner(s);
}
}
 
// This code is contributed by Rajput-Ji

Python3




# Python3 implementation of the approach
 
# Function to play the game
# and find the winner
def findWinner(s) :
 
    count = 0
    n = len(s);
    st = [];
 
    # ckecking the top of the stack with
    # the i th character of the string
    # add it to the stack if they are different
    # otherwise increment count
    for i in range(n) :
        if (len(st) == 0 or st[-1] != s[i]) :
            st.append(s[i]);
             
        else :
            count += 1;
            st.pop();
 
    # Check who has won
    if (count % 2 == 0) :
        print("B");
     
    else :
        print("A");
         
# Driver code
if __name__ == "__main__" :
 
    s = "kaak";
 
    findWinner(s);
 
# This code is contributed by AnkitRai01

C#




// C# implementation for above approach
using System;
using System.Collections.Generic;
 
class GFG
{
 
// Function to play the game
// and find the winner
static void findWinner(String s)
{
    int i, count = 0, n;
    n = s.Length;
    Stack<char> st = new Stack<char>();
 
    // ckecking the top of the stack with
    // the i th character of the string
    // add it to the stack if they are different
    // otherwise increment count
    for (i = 0; i < n; i++)
    {
        if (st.Count == 0 ||
            st.Peek() != s[i])
        {
            st.Push(s[i]);
        }
        else
        {
            count++;
            st.Pop();
        }
    }
 
    // Check who has won
    if (count % 2 == 0)
    {
        Console.WriteLine("B");
    }
    else
    {
        Console.WriteLine("A");
    }
}
 
// Driver code
public static void Main(String[] args)
{
    String s = "kaak";
 
    findWinner(s);
}
}
 
// This code is contributed by 29AjayKumar

Javascript




<script>
    // Javascript implementation for above approach
     
    // Function to play the game
    // and find the winner
    function findWinner(s)
    {
        let i, count = 0, n;
        n = s.length;
        let st = [];
 
        // ckecking the top of the stack with
        // the i th character of the string
        // add it to the stack if they are different
        // otherwise increment count
        for (i = 0; i < n; i++)
        {
            if (st.length == 0 ||
                st[st.length - 1] != s[i])
            {
                st.push(s[i]);
            }
            else
            {
                count++;
                st.pop();
            }
        }
 
        // Check who has won
        if (count % 2 == 0)
        {
            document.write("B");
        }
        else
        {
            document.write("A");
        }
    }
     
    let s = "kaak";
   
    findWinner(s);
 
// This code is contributed by divyesh072019.
</script>

Output: 

B

 

Time Complexity: O(n)

Auxiliary Space: O(n)


My Personal Notes arrow_drop_up
Related Articles

Start Your Coding Journey Now!