Related Articles

# Maximum count of X that can be inserted with no 3 adjacent characters are X

• Difficulty Level : Expert
• Last Updated : 03 Aug, 2021

Given a string, str of length N and a character X, the task is to find the maximum count of characters X that are to be inserted into the string such that no three consecutive characters are equal to X. If it is not possible to find such a string, then print -1.

Examples:

Input: str = “xxyxy”, X = X
Output:
Explanation:
Insert an ‘x’ at position 4: “xxyxxy”.
Insert two ‘x’ at position 7: “xxyxxyxx”
Now no more ‘x’ can be inserted, as it will lead to a size 3 substring with all x in it.
Hence the required count is 3.

Input:str = “gfg”, X = ‘X’
Output: 8

Approach: The idea is to count all the positions where X can be inserted and then subtract the count of already present X in the string.
Below are the steps:

1. The maximum number of X that can be inserted in the string is 2 * (N + 1) characters as it is possible to insert two X at the start and end of the string and between every consecutive character.
2. Now, find the number of groups of consecutive X having a size of 1 or 2 and store it in a variable countX.
3. The number of X that can be inserted in the given string is 2 * (number of places to be inserted + 1) – number of found Xs.
4. In conclusion, a simple mathematical formula, 2 * (N + 1) – (N – Xs) can be used to find the final answer.

Below is the implementation of the above approach:

## Java

 `// Java program for the above approach` `import` `java.util.*;` `public` `class` `Main {` `    ``// Utility function to find maximum count of``    ``// X that are to be inserted into str such that``    ``// no three consecutive characters are equal to X``    ``static` `int` `maxNumberOfXAddedUtil(String str, ``char` `X)``    ``{` `        ``// Stores count of consecutive X``        ``int` `countX = ``0``;` `        ``// Stores count of characters which``        ``// is not equal to X``        ``int` `countNotX = ``0``;` `        ``// Iterate over characters of string, str``        ``for` `(``int` `i = ``0``; i < str.length(); i++) {` `            ``// If current character is X``            ``if` `(str.charAt(i) == X) {` `                ``// Update  countX``                ``countX++;``            ``}` `            ``// If countX is less``            ``// than 3``            ``else` `if` `(countX < ``3``) {` `                ``// Update countNotX``                ``countNotX++;` `                ``// Update countX``                ``countX = ``0``;``            ``}``        ``}` `        ``// If countX is greater than``        ``// or equal to 3``        ``if` `(countX >= ``3``)``            ``return` `-``1``;``        ``else``            ``return` `2` `* (countNotX + ``1``)``                ``- (str.length() - countNotX);``    ``}` `    ``// Function to find maximum count of X that``    ``// are to be inserted into str such that no``    ``// three consecutive characters are equal to X``    ``static` `void` `maxNumberOfXAdded(String str, ``char` `X)``    ``{` `        ``int` `ans = maxNumberOfXAddedUtil(str, X);` `        ``// Print the answer``        ``System.out.println(ans);``    ``}` `    ``// Driver Code``    ``public` `static` `void` `main(String[] args)``    ``{` `        ``// Given string``        ``String str = ``"xxyxy"``;` `        ``char` `X = X;` `        ``// Function Call``        ``maxNumberOfXAdded(str, X);``    ``}``}`

## C#

 `// C# program for the above approach``using` `System;` `class` `GFG{` `    ``// Utility function to find maximum count of``    ``// X that are to be inserted into str such that``    ``// no three consecutive characters are equal to X``    ``static` `int` `maxNumberOfXAddedUtil(``string` `str, ``char` `X)``    ``{` `        ``// Stores count of consecutive X``        ``int` `countX = 0;` `        ``// Stores count of characters which``        ``// is not equal to X``        ``int` `countNotX = 0;` `        ``// Iterate over characters of string, str``        ``for` `(``int` `i = 0; i < str.Length; i++) {` `            ``// If current character is X``            ``if` `(str[i] == X) {` `                ``// Update  countX``                ``countX++;``            ``}` `            ``// If countX is less``            ``// than 3``            ``else` `if` `(countX < 3) {` `                ``// Update countNotX``                ``countNotX++;` `                ``// Update countX``                ``countX = 0;``            ``}``        ``}` `        ``// If countX is greater than``        ``// or equal to 3``        ``if` `(countX >= 3)``            ``return` `-1;``        ``else``            ``return` `2 * (countNotX + 1)``                ``- (str.Length - countNotX);``    ``}` `    ``// Function to find maximum count of X that``    ``// are to be inserted into str such that no``    ``// three consecutive characters are equal to X``    ``static` `void` `maxNumberOfXAdded(``string` `str, ``char` `X)``    ``{` `        ``int` `ans = maxNumberOfXAddedUtil(str, X);` `        ``// Print the answer``        ``Console.Write(ans);``    ``}` `// Driver Code``public` `static` `void` `Main()``{``     ``// Given string``        ``string` `str = ``"xxyxy"``;` `        ``char` `X = ``'x'``;` `        ``// Function Call``        ``maxNumberOfXAdded(str, X);``}``}` `// This code is contributed by target_2.`
Output:
`3`

Time Complexity: O(N)
Auxiliary Space: O(1)

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.  To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.

In case you wish to attend live classes with experts, please refer DSA Live Classes for Working Professionals and Competitive Programming Live for Students.

My Personal Notes arrow_drop_up