# Number of ways to remove a sub-string from S such that all remaining characters are same

• Last Updated : 13 Sep, 2022

Given a string str consisting only of lowercase English alphabets, the task is to count the number of ways to remove exactly one sub-string from str such that all remaining characters are same.

Note: There are at least two different characters in str and we can remove the whole string as well.

Examples:

Input: str = “abaa”
Output:
We can remove the following sub-strings to satisfy the given condition:
str[0:1], str[0:2], str[0:3], str[1:1], str[1:2] and str[1:3]

Input: str = “geeksforgeeks”
Output:
We remove complete string.
We remove all except first.
We remove all except last

Approach:

• Store the length of prefix and suffix of same characters from the string in variables count_left and count_right.
• It is obvious that this prefix and suffix wouldn’t overlap, since there are at least two different characters in str.
• Now there are 2 cases:
• When str[0] = str[n – 1] then every character of the prefix (including the character just after the prefix ends) will act as the starting character of the sub-string and every character of the suffix (including the character just before the suffix starts) will act as the ending character of the sub-string. So, total valid sub-strings will be count = (count_left + 1) * (count_right + 1).
• When str[0] != str[n – 1]. then count = count_left + count_right + 1.

Below is the implementation of the above approach:

## C++

 `// C++ program to count number of ways of``// removing a substring from a string such``// that all remaining characters are equal``#include ``using` `namespace` `std;` `// Function to return the number of ways``// of removing a sub-string from s such``// that all the remaining characters are same``int` `no_of_ways(string s)``{``    ``int` `n = s.length();` `    ``// To store the count of prefix and suffix``    ``int` `count_left = 0, count_right = 0;` `    ``// Loop to count prefix``    ``for` `(``int` `i = 0; i < n; ++i) {``        ``if` `(s[i] == s[0]) {``            ``++count_left;``        ``}``        ``else``            ``break``;``    ``}` `    ``// Loop to count suffix``    ``for` `(``int` `i = n - 1; i >= 0; --i) {``        ``if` `(s[i] == s[n - 1]) {``            ``++count_right;``        ``}``        ``else``            ``break``;``    ``}` `    ``// First and last characters of the``    ``// string are same``    ``if` `(s[0] == s[n - 1])``        ``return` `((count_left + 1) * (count_right + 1));` `    ``// Otherwise``    ``else``        ``return` `(count_left + count_right + 1);``}` `// Driver function``int` `main()``{``    ``string s = ``"geeksforgeeks"``;``    ``cout << no_of_ways(s);` `    ``return` `0;``}`

## Java

 `// Java program to count number of ways of``// removing a substring from a string such``// that all remaining characters are equal``import` `java.util.*;` `class` `solution``{` `// Function to return the number of ways``// of removing a sub-string from s such``// that all the remaining characters are same``static` `int` `no_of_ways(String s)``{``    ``int` `n = s.length();` `    ``// To store the count of prefix and suffix``    ``int` `count_left = ``0``, count_right = ``0``;` `    ``// Loop to count prefix``    ``for` `(``int` `i = ``0``; i < n; ++i) {``        ``if` `(s.charAt(i) == s.charAt(``0``)) {``            ``++count_left;``        ``}``        ``else``            ``break``;``    ``}` `    ``// Loop to count suffix``    ``for` `(``int` `i = n - ``1``; i >= ``0``; --i) {``        ``if` `(s.charAt(i) == s.charAt(n - ``1``)) {``            ``++count_right;``        ``}``        ``else``            ``break``;``    ``}` `    ``// First and last characters of the``    ``// string are same``    ``if` `(s.charAt(``0``) == s.charAt(n - ``1``))``        ``return` `((count_left + ``1``) * (count_right + ``1``));` `    ``// Otherwise``    ``else``        ``return` `(count_left + count_right + ``1``);``}` `// Driver function``public` `static` `void` `main(String args[])``{``    ``String s = ``"geeksforgeeks"``;``    ``System.out.println(no_of_ways(s));` `}``}`

## Python3

 `# Python 3 program to count number of``# ways of removing a substring from a``# string such that all remaining``# characters are equal` `# Function to return the number of``# ways of removing a sub-string from``# s such that all the remaining``# characters are same``def` `no_of_ways(s):``    ``n ``=` `len``(s)` `    ``# To store the count of``    ``# prefix and suffix``    ``count_left ``=` `0``    ``count_right ``=` `0` `    ``# Loop to count prefix``    ``for` `i ``in` `range``(``0``, n, ``1``):``        ``if` `(s[i] ``=``=` `s[``0``]):``            ``count_left ``+``=` `1``        ``else``:``            ``break` `    ``# Loop to count suffix``    ``i ``=` `n ``-` `1``    ``while``(i >``=` `0``):``        ``if` `(s[i] ``=``=` `s[n ``-` `1``]):``            ``count_right ``+``=` `1``        ``else``:``            ``break` `        ``i ``-``=` `1` `    ``# First and last characters of``    ``# the string are same``    ``if` `(s[``0``] ``=``=` `s[n ``-` `1``]):``        ``return` `((count_left ``+` `1``) ``*``                ``(count_right ``+` `1``))` `    ``# Otherwise``    ``else``:``        ``return` `(count_left ``+` `count_right ``+` `1``)` `# Driver Code``if` `__name__ ``=``=` `'__main__'``:``    ``s ``=` `"geeksforgeeks"``    ``print``(no_of_ways(s))` `# This code is contributed by``# Sahil_shelengia`

## C#

 `// C# program to count number of ways of``// removing a substring from a string such``// that all remaining characters are equal``using` `System;` `class` `GFG``{` `// Function to return the number of ways``// of removing a sub-string from s such``// that all the remaining characters are same``static` `int` `no_of_ways(``string` `s)``{``    ``int` `n = s.Length;` `    ``// To store the count of prefix and suffix``    ``int` `count_left = 0, count_right = 0;` `    ``// Loop to count prefix``    ``for` `(``int` `i = 0; i < n; ++i)``    ``{``        ``if` `(s[i] == s[0])``        ``{``            ``++count_left;``        ``}``        ``else``            ``break``;``    ``}` `    ``// Loop to count suffix``    ``for` `(``int` `i = n - 1; i >= 0; --i)``    ``{``        ``if` `(s[i] == s[n - 1])``        ``{``            ``++count_right;``        ``}``        ``else``            ``break``;``    ``}` `    ``// First and last characters of the``    ``// string are same``    ``if` `(s[0] == s[n - 1])``        ``return` `((count_left + 1) *``                ``(count_right + 1));` `    ``// Otherwise``    ``else``        ``return` `(count_left + count_right + 1);``}` `// Driver Code``public` `static` `void` `Main()``{``    ``string` `s = ``"geeksforgeeks"``;``    ``Console.WriteLine(no_of_ways(s));``}``}` `// This code is contributed``// by Akanksha Rai`

## PHP

 `= 0; --``\$i``)``    ``{``        ``if` `(``\$s``[``\$i``] == ``\$s``[``\$n` `- 1])``        ``{``            ``++``\$count_right``;``        ``}``        ``else``            ``break``;``    ``}` `    ``// First and last characters of the``    ``// string are same``    ``if` `(``\$s``[0] == ``\$s``[``\$n` `- 1])``        ``return` `((``\$count_left` `+ 1) *``                ``(``\$count_right` `+ 1));` `    ``// Otherwise``    ``else``        ``return` `(``\$count_left` `+ ``\$count_right` `+ 1);``}` `// Driver Code``\$s` `= ``"geeksforgeeks"``;``echo` `no_of_ways(``\$s``);` `// This code is contributed by ihritik``?>`

## Javascript

 ``

Output

`3`

Complexity Analysis:

• Time Complexity: O(n), where n is the size of the given string
• Auxiliary Space: O(1), as no extra space is required

My Personal Notes arrow_drop_up