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

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:6

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:3

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**.

- When

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 <bits/stdc++.h> ` `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; ` `} ` |

*chevron_right*

*filter_none*

## 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)); ` ` ` `} ` `} ` |

*chevron_right*

*filter_none*

## 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 ` |

*chevron_right*

*filter_none*

## 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 ` |

*chevron_right*

*filter_none*

## 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

?>

**Output:**

3

## Recommended Posts:

- Number of ways in which the substring in range [L, R] can be formed using characters out of the range
- Minimum characters to be replaced to remove the given substring
- Number of Positions to partition the string such that atleast m characters with same frequency are present in each substring
- Remove minimum number of characters so that two strings become anagram
- Maximum length substring having all same characters after k changes
- Longest substring of only 4's from the first N characters of the infinite string
- Print Longest substring without repeating characters
- Searching characters and substring in a String in Java
- Minimum length substring with exactly K distinct characters
- Length of the longest substring with consecutive characters
- Length of the longest substring without repeating characters
- Minimum steps to remove substring 010 from a binary string
- Find the longest substring with k unique characters in a given string
- Minimum steps to delete a string by deleting substring comprising of same characters
- Remove characters that appear more than k times

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.