# 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
- Largest substring with same Characters
- Maximum length substring having all same characters after k changes
- Minimum length substring with exactly K distinct characters
- Print Longest substring without repeating characters
- Length of the longest substring without repeating characters
- Searching characters and substring in a String in Java
- Longest substring of only 4's from the first N characters of the infinite string
- Length of the longest substring with consecutive 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

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.